Использование пользовательской авторизации в 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;
}
}
}