Я использую функцию jQuert .ajax для вызова метода страницы. Сайт использует FormsAuthentication. Поэтому, когда срок действия билета проверки подлинности истекает, вызов метода страницы, очевидно, вызовет перенаправление на страницу входа.
Теперь гении, написавшие System.Web.Handlers.ScriptModule, решили, что если по какой-то причине вызов стиля REST метода страницы или метода веб-службы из JavaScript вызывает перенаправление 302, они просто включат ответ на сообщение 401 Unauthorized. Это приводит к тому, что браузер отображает пользовательский интерфейс входа в систему, который полностью вводит в заблуждение, поскольку пользователь пытается ввести свое имя пользователя и пароль, что ничего не значит, потому что используется FormsAuthentication. Наконец, когда пользователь нажимает кнопку «Отмена», 401 поступает в обработчик ошибок.
Итак, вопрос в том, как можно каким-либо образом отключить приглашение пользовательского интерфейса входа в систему в браузере? Некоторые люди в Интернете предлагают использовать имя пользователя и пароль в запросе XHR, но, похоже, это не работает.

Думаю, я обошел это стороной. Конечно, полагаться на внутренние ошибки, связанные с MS AJAX, не очень хорошо, но это поможет другим, столкнувшимся с этой проблемой.
В основном, что вы делаете, вы устанавливаете заголовок X-MicrosoftAjax на значение Дельта = истина (здесь важен регистр), ScriptModule интерпретирует это как обычное перенаправление и превращает ответ в 200, но установит строку данных pageRedirect для любого ScriptManager (MS-AJAX PageRequestManager) на странице для использования. Функция jQuery.ajax по-прежнему будет рассматривать это как ошибку, поэтому в основном вы можете проверить pageRedirect в свойстве responseText XHR и обработать его соответствующим образом. Например, отправка пользователя на страницу входа в систему.
$.ajax({
type: "POST",
url: postUrl + "/SomePageMethod",
data: "{searchString:\"" + escape(searchString) + "\"}",
contentType: "application/json; charset=utf-8",
beforeSend: function(xhr) {
xhr.setRequestHeader("X-MicrosoftAjax","Delta=true");
},
dataType: "json",
success: onSuccess,
error: onError
});
function onError(xhr, e, textStatus) {
var isAjaxRedirect = xhr.status == 200 && xhr.responseText.match(/pageRedirect/);
if (isAjaxRedirect == "pageRedirect") {
// forms authentication ticket expired
location.href = "a session timeout page, or a login page or whatever";
}
}
Что ж, проблема специфичен для использования стека Microsoft, И решение - только браузер. Не уверен, в чем именно ваша проблема.
Это можно отключить в IIS. Подробности, описанные ниже, относятся к IIS6, но не должно быть сложно найти соответствующие элементы для IIS7 и выше.
Вы больше не должны видеть всплывающее окно в своем браузере и иметь возможность отправлять правильные коды состояния по своему усмотрению.
Оба отличные ответы. Но если ваш веб-сайт размещен на общем сервере, вы, вероятно, не сможете изменить настройки IIS, поэтому решение на стороне клиента потрясает. Я столкнулся с той же проблемой, и этот пост меня спасает. Мои два цента на решение: В jquery (по крайней мере, в последних версиях) вы можете использовать параметр под названием «header» для отправки этих заголовков без использования обратного вызова «beforeSend», и я думаю, что это может быть немного более простым способом сделать то же самое. Вы также можете добавить сюда другую информацию заголовка:
$.ajax({
type: "POST",
url: postUrl + "/SomePageMethod",
data: "{searchString:\"" + escape(searchString) + "\"}",
contentType: "application/json; charset=utf-8",
headers: { "cache-control": "no-cache", "X-MicrosoftAjax" : "Delta=true" },
dataType: "json",
success: onSuccess,
error: onError
});
Я не знал об этом заголовке Delta = true и после небольшого исследования, похоже, это заголовок, сообщающий серверу, что выполняемый вами запрос является асинхронным запросом обратной передачи.
Вызов AJAX вернет HTTP-статус 200 (вместо «Неавторизован» 401) в обратном вызове «ошибка», что означает, что запрос сервера каким-то образом был успешным (хотя аутентификация не удалась). Немного странно, но как это работает.
Надеюсь это поможет.
Добавление заголовка «X-MicrosoftAjax»: «Delta = true», похоже, решило мою проблему с получением запросов на вход на BASIC.
Я не совсем понимаю. вы делаете что-то на сервере, чтобы превратить ваши 401 в 200? это не помогает, если вы не используете стек Microsoft или у вас нет доступа к серверу. мне нужно решение только для браузера.