Код ответа 401, запускающий базовую аутентификацию перед обработчиком ошибок jquery ajax - PullRequest
12 голосов
/ 09 января 2012

У меня есть сценарий, в котором я должен обрабатывать аутентификацию ajax-запросов, используя «Аутентификацию по формам».Основываясь на поиске и помощи из моей предыдущей статьи, я решил использовать метод, описанный здесь здесь .

Идея состоит в том, чтобы отправить ответ 401 для неаутентифицированных запросов, а затем обработать его в обработчике ошибок AJAX.Итак, у меня есть обработчик ошибок AJAX на моей странице компоновки ASP.net MVC3, который перенаправляет браузер на страницу входа в систему, когда он получает ответ 401 на неаутентифицированные запросы ajax.Вот обработчик ошибок ajax.

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
    if (jqXHR.status == "401") {
        window.location.replace(loginUrl);
    }
    ....
});

Все это хорошо работает на моем локальном сервере IIS 7.5.Но на сервере, где размещен мой сайт, к сожалению, я получаю всплывающее окно базовой аутентификации для неаутентифицированных запросов AJAX (например, тайм-аут сеанса) до запуска обработчика ошибок AJAX и перенаправления браузера на страницу входа.Когда я отменяю всплывающее окно «Требуется аутентификация» нажатием кнопки «Отмена», запускается обработчик ошибок AJAX, и я перенаправляюсь на страницу входа.

Итак, почему браузер показывает всплывающее окно аутентификации перед запуском обработчика ошибок AJAX?

Редактировать: Сервер хостинга работает под управлением IIS 6.

Ответы [ 8 ]

2 голосов
/ 10 января 2014

как Softlion сказал

Это распространенный вопрос с простым ответом. 401 преобразуется в страницу 302 для входа в систему> модулем авторизации .net. Браузер никогда не видит 401 только 302.

если вы используете .net 4 и более поздние версии, используйте код ниже

HttpContext.Response.SuppressFormsAuthenticationRedirect = true;

это хорошо для меня.

1 голос
/ 19 января 2012

Это распространенный вопрос с легким ответом. 401 преобразуется в страницу 302 для входа в систему с помощью модуля авторизации .net. Браузер никогда не видит 401 только 302.

Конечно, это не очень хорошо с вызовами ajax.

Лучшее решение, которое я пробовал и в настоящее время использую, заключается в написании нового атрибута, который перехватывает 401 и преобразует его в ... 409, который перехватывается обработчиком jquery ajax.

Это часть платного продукта, поэтому я не могу дать код.

0 голосов
/ 11 февраля 2016

Для меня это оказалось просто.На большинстве веб-сайтов IIS с анонимной аутентификацией также включена проверка подлинности Windows по умолчанию

Authentication configuration

Отключите проверку подлинности Windows, которая появляется на экране входа в систему, когдасайт обнаруживает 401 даже при вызове AJAX.

<security> <authentication> <anonymousAuthentication enabled="true" /> <windowsAuthentication enabled="false" /> </authentication> </security>

0 голосов
/ 24 февраля 2012

Решение здесь - написать собственный HttpModule для обхода поведения по умолчанию в рамках MVC.Как только я наконец смог зарегистрировать модуль ( ура Дэвида Эббо ), он заработал для меня.Вы можете выбрать свои собственные критерии для звонков SuppressAuthenticationRedirect.

public class SuppressFormsAuthenticationRedirectModule : IHttpModule {
  private static readonly object SuppressAuthenticationKey = new Object();

  public static void SuppressAuthenticationRedirect(HttpContext context) {
    context.Items[SuppressAuthenticationKey] = true;
  }

  public static void SuppressAuthenticationRedirect(HttpContextBase context) {
    context.Items[SuppressAuthenticationKey] = true;
  }

  public void Init(HttpApplication context) {
    context.PostReleaseRequestState += OnPostReleaseRequestState;
    context.EndRequest += OnEndRequest;
  }

  private void OnPostReleaseRequestState(object source, EventArgs args) {
    var context = (HttpApplication)source;
    var response = context.Response;
    var request = context.Request;

    if (response.StatusCode == 401 && request.Headers["X-Requested-With"] == 
      "XMLHttpRequest") {
      SuppressAuthenticationRedirect(context.Context);
    }
  }

  private void OnEndRequest(object source, EventArgs args) {
    var context = (HttpApplication)source;
    var response = context.Response;

    if (context.Context.Items.Contains(SuppressAuthenticationKey)) {
      response.TrySkipIisCustomErrors = true;
      response.ClearContent();
      response.StatusCode = 401;
      response.RedirectLocation = null;
    }
  }

  public void Dispose() {
  }

  public static void Register() {
    DynamicModuleUtility.RegisterModule(
      typeof(SuppressFormsAuthenticationRedirectModule));
  }
}
0 голосов
/ 22 января 2012

Подождите! Я думал, что вы сказали запрос Ajax, как вы можете получить всплывающее окно на запрос Ajax? Я совершенно уверен, что где-то еще вы инициируете вызов URL-адреса еще до вызова AJAX. Из вашего сценария доказано, что когда вы отменяете всплывающее окно, ваш фактический запрос ajax выполняется, и, следовательно, вы можете сделать ajax redirect.

Идея состоит в том, чтобы отправить обратно ответ 401 для неаутентифицированных запросов, а затем обработать его в обработчике ошибок AJAX

Вы можете получить ответ ajax, только если отправите запрос ajax, если вы отправите обычный запрос http, вы получите всплывающее окно. Это не имеет ничего общего с .Net или Java:)

0 голосов
/ 17 января 2012

.net не будет ловить 401 ошибки.Что я сделал, так это установил страницу ошибок IIS со страницы 401 по умолчанию на мою собственную статическую страницу 401.С этой страницы я использовал javascript для перенаправления на другой обработчик.

0 голосов
/ 17 января 2012

IIS 6 в интегрированном режиме? Я не верю, что есть такая вещь, если вы не говорите о встроенной аутентификации.

Я предполагаю, что вы используете расширение не aspx, поэтому на IIS6 это означает, что оно даже не затрагивает процесс .net. Итак, IIS использует свою собственную страницу ответа об ошибке 401.

Вероятно, решение состоит в том, чтобы заставить все запросы обрабатываться процессом .net.

Ваш хост должен будет перейти в свойства IIS> конфигурация> сопоставления с подстановочными знаками - и сопоставить все с процессом .net.

0 голосов
/ 17 января 2012

Попробуйте удалить заголовок WWW-Authenticate из ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...