Атрибут авторизации ASP.NET MVC перенаправляет 302, когда пользователь не авторизовался
MSDN явно говорит, что он должен сделать переадресацию 401, но я получаю перенаправление 302 на FF, и это вызывает проблемы в запросах AJAX, так как возвращаемый статус равен 200 (с перенаправленной страницы).
http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx
Я нашел кого-то другого с той же проблемой:
http://blog.nvise.com/?p=26
Любое другое решение, помимо его?
Ответы
Ответ 1
Атрибут Authorize возвращает HART 401 Unauthorized response. К сожалению, однако, если у вас включена функция FormsAuthentication, 401 перехватывается FormsAuthenticationModule, который затем выполняет перенаправление на страницу входа в систему, которая возвращает Http 200 (и страницу входа) обратно в ваш запрос ajax.
Лучшей альтернативой является написать свой собственный атрибут авторизации, а затем, если вы получите неаутентифицированный запрос, который также является запросом Ajax, верните другой код состояния Http - скажем, 403 - который не пойман формамиAuthenticationModule, и вы можете поймать в вашем методе Ajax.
Ответ 2
Мне действительно нравится это решение. Изменяя ответ 302 на запросы ajax на 401, он позволяет настроить ваш ajax на стороне клиента, чтобы отслеживать любой запрос ajax, ищущий 401, и если он найдет перенаправление на страницу входа. Очень простой и эффективный.
Global.asax:
protected void Application_EndRequest()
{
if (Context.Response.StatusCode == 302 &&
Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
Context.Response.Clear();
Context.Response.StatusCode = 401;
}
}
Клиентский код:
$(function () {
$.ajaxSetup({
statusCode: {
401: function () {
location.href = '/Logon.aspx?ReturnUrl=' + location.pathname;
}
}
});
});
Ответ 3
Я реализовал свой собственный атрибут авторизации, который унаследовал от AuthorizeAttribute и столкнулся с той же проблемой.
Тогда я узнал, что с .Net 4.5 есть решение этого - вы можете подавить перенаправление следующим образом:
context.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
Тогда ответ будет 401 - Несанкционированный, а также HTTP-проверка подлинности.
Подробнее здесь
Ответ 4
Если вы используете веб-приложение ASP.NET MVC 5, перейдите в App_Start
→ Startup.Auth.cs
. Проверьте, включен ли app.UseCookieAuthentication
, и посмотрите, установлен ли CookieAuthenticationOptions
на LoginPath = new PathString("/Login"),
или аналогичный. Если вы удалите этот параметр, 401
остановит перенаправление.
Описание для LoginPath
:
Свойство LoginPath информирует промежуточное программное обеспечение о том, что оно должно исходящий 401 Несанкционированный код состояния в перенаправление 302 на заданный путь входа в систему. Текущий url, который сгенерировал 401, добавляется к LoginPath как параметр строки запроса, названный ReturnUrlParameter. Как только запрос в LoginPath предоставляет новый Идентификатор SignIn, значение ReturnUrlParameter используется для перенаправления браузер вернулся к URL-адресу, который вызвал исходный несанкционированный статус код. Если LoginPath имеет значение null или пустое, промежуточное ПО не будет выглядеть для 401 Несанкционированных кодов состояния, и он не будет перенаправлен автоматически при входе в систему.