Как запустить диалоговое окно базовой аутентификации браузера из вызова AJAX?
Я использую базовую аутентификацию для защиты набора веб-служб WCF, предоставляемых только внутри нашей корпоративной сети, и мне было интересно, есть ли способ вызвать диалоговое окно учетных данных браузера, чтобы появиться из вызова AJAX, когда веб-служба возвращается с ошибкой 401?
В настоящее время мой вызов AJAX получает 401 как обычный неудачный запрос и не запрашивает браузер ничего делать. Однако, если я возьму тот же URI и скопирую его в URL-адрес браузера, возвращенный 401 правильно запускает основное диалоговое окно проверки подлинности.
есть ли способ получить обратный вызов AJAX, чтобы сообщить браузеру, чтобы открыть это диалоговое окно?
8 ответов
динамически создайте iframe с вашим url-адресом и добавьте в документ. Это вызовет форму аутентификации. jQuery snipet добавить iframe
$('<iframe src="your_url"></iframe>').appendTo('body')
очень упрощенный пример здесь:
var url = 'your_url_here';
$.ajax({
url: url,
error: function(response){
if(response.status==401){
$('<iframe src="'+url+'"></iframe>').appendTo('body');
}
},
success:function(){
//your success code here
}
});
вы не можете, вам нужно будет предоставить запрос с учетными данными.
посмотреть как использовать базовую аутентификацию с jQuery и AJAX?
вы бы предложили открыть/отобразить / вставить форму, чтобы разрешить вставку имени пользователя и пароля, а затем повторно отправить запрос AJAX с заданными учетными данными. Я бы не стал на самом деле в браузерах credential popup.
Как вы устанавливаете заголовок аутентификации, вы можете прочитать здесь:как использовать базовую аутентификацию с jQuery и AJAX?
Да, вы можете вызвать его из AJAX. Просто передайте запрос со следующим заголовком:
withCredentials: true
я столкнулся почти с той же проблемой 401, за исключением того, что мой запрос был кросс-доменом. Но я надеюсь, что причина та же. Следуя инструкциям на разработчика.mozilla-управление доступом CORS мне, наконец, удалось с простым:
var xhttp=new XMLHttpRequest();
xhttp.withCredentials = true;
xhttp.open("GET", "https://my.foo.server/app/resource", true);
xhttp.send();
Я думаю xhttp.withCredentials
такое решение. Это не заголовок! Вы позволяете браузеру общаться с сервером через cookies. Следующий ответ многое объясняет XHR2 withCredentials - какие файлы cookie отправляются?
без xhttp.withCredentials
всегда 401 (Unauthorized)
. Но, используя его, браузер добавил необходимый заголовок Authorization:Basic dGVFooFooFooFoosaWVudA==
или запускается окно входа, когда данные еще не были доступны.
Как найти где-то в стеке :
получение ответа 401-это сервер, который говорит вам: "вы не проверку подлинности не прошла проверку подлинности или проверку подлинности неправильно–но, пожалуйста, повторите проверку и повторите попытку.- Чтобы помочь тебе., он всегда будет включать заголовок WWW-Authenticate, который описывает, как аутентификация
используйте jQuery beforeSend
обратный вызов для добавления заголовка HTTP с информацией аутентификации
beforeSend: function (xhr) {
xhr.setRequestHeader ("Authorization", "Basic " + btoa(username + ":" + password));
},
выполняете ли Вы условия, выделенные в это так ответить?
также на основе в ответ вы можете проверить, что заголовки, возвращаемые из вашего бэкэнда, одинаковы, независимо от того, запрашиваете ли вы его из браузера или из вызова AJAX.
вы можете просто запустить перенаправление при проверке условия 401:
window.location = "https://example.com"