Использование пользовательской авторизации в MVC 4

В настоящее время я разрабатываю веб-API с использованием типа проекта API MVC 4. Я сейчас на этапе, когда мне нужно добавить некоторую безопасность в API. Я знаю атрибут Authorize, однако клиент предпочел бы другой подход. Для этого я попытался переопределить атрибут Authorize в своем собственном классе, и в качестве базового старта у меня просто есть AuthorizeCore, всегда возвращающий false, что должно означать не аутентификацию. Если я добавлю это к Action в контроллер, действие всегда будет завершено, и я всегда получаю данные. Я считаю, причина может быть связана с тем, что пользовательский атрибут не зарегистрирован в файле web.config, однако я не уверен, как это сделать, если вы не используете проверку подлинности форм.

Код, который я использую для тестирования, представляет собой новый проект веб-API MVC 4 с пользовательским атрибутом, показанным ниже.

public class Auth : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return false;
    }
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectResult("http://www.google.com");
    }
}

Затем я добавил атрибут в метод Get по умолчанию ValuesController как таковой

[Auth]
public IEnumerable<string> Get()

Однако, когда я перехожу к домену /api/Values, я всегда представляю данные вместо ожидаемого перенаправления на google. Любая помощь приветствуется.

Изменить: после осмотра еще немного я нашел это здесь: http://weblogs.asp.net/jgalloway/archive/2012/05/04/asp-net-mvc-authentication-customizing-authentication-and-authorization-the-right-way.aspx Это говорит о том, что я выбрал неправильный неправильный класс AuthorizeAttribute, поскольку я выбрал тот из System.Web.MVC, а не один из System.Web.Http. Похоже, что версия Http не позволяет использовать тот же уровень конфигурации, что и версия MVC, поскольку она не позволяет мне переопределить AuthorizeCore. Любую помощь по этому поводу оценивают.

Ответ 1

Похоже, что проблема была вызвана неправильной версией AuthorizeAttribute. После использования версии, найденной в System.Web.Http, код возвращает правильный код ошибки, если у пользователя нет необходимых разрешений. В качестве примера здесь приведен эквивалентный код тому, что я поставил в исходном вопросе

using System;
using System.Web.Http;
using System.Net.Http;

public class AuthAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        HandleUnauthorizedRequest(actionContext);
    }

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Redirect);
        response.Headers.Add("Location", "http://www.google.com");
        actionContext.Response = response;
    }
}

Ответ 2

Для WebApi вы можете заставить его переопределить правильный класс AuthorizeAttribute, указав его в переопределении. Кроме того, не имеет смысла делать перенаправление, это просто возвращает неавторизованный веб-ответ, который подходит для API.

namespace WebApiTest
{
    public class Auth : System.Web.Http.AuthorizeAttribute
    {
        protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            return false;
        }

    }
}