Подтвердить что ты не робот

Атрибут авторизации 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

Любое другое решение, помимо его?

4b9b3361

Ответ 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_StartStartup.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 Несанкционированных кодов состояния, и он не будет перенаправлен автоматически при входе в систему.