У меня есть стандартный проект VS2013 MVC5 с Web Api 2. В стандартном проекте атрибуты [Authorize] просто возвращают код состояния 401, если запрос не аутентифицирован, в то время как совершенно отдельный модуль перехватывает любые коды 401, останавливает их и вместо этого отправляет перенаправление 302 на страницу входа, указанную в файл Startup.Auth.cs. Это нормально для контроллеров Mvc, но действительно воняет для контроллеров Web Api, потому что, например, браузеры будут автоматически перенаправлять ajax-запросы на URL-адрес входа, поэтому в конечном итоге вы получите статус 200OK, даже если текст ответа — это просто html страницы входа.
Это затрудняет написание хорошего javascript, который может отличить случай, когда вам просто нужно сказать пользователю войти снова, от других видов ошибок. В идеале мы должны быть в состоянии сказать, основываясь на коде состояния, но javascript никогда не видит статус 401. Каков наилучший способ справиться с этим?
Моей первой мыслью было написать атрибут авторизации, но использовать код состояния 403 вместо 401:
public class ApiAuthorizationAttribute : System.Web.Http.AuthorizeAttribute
{
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (actionContext.RequestContext.Principal.Identity.IsAuthenticated)
{
base.OnAuthorization(actionContext);
}
else
{
actionContext.Response = actionContext.ControllerContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Not signed in.");
}
}
}
Конечно, в спецификациях явно указано, что 403 неверен:
Авторизация не поможет и запрос НЕ ДОЛЖЕН повторяться
Моя другая мысль заключается в том, что, возможно, мне следует вообще отключить модуль перенаправления 401 asp.net и обрабатывать перенаправления в пользовательских атрибутах авторизации, потому что даже для представлений Mvc это паршиво, потому что он не позволяет вам перенаправлять на разные страницы входа в зависимости от того, где в сайт, который пользователь пытается посетить.
Существуют ли другие, лучшие подходы к решению этой проблемы?