Как вызвать диалог "Базовая аутентификация" браузера с помощью вызова AJAX?
Я использую базовую аутентификацию для защиты набора веб-сервисов WCF, открытых только внутри нашей корпоративной сети, и мне было интересно, есть ли способ инициировать диалог учетных данных браузера с вызовом AJAX при возврате веб-службы с ошибкой 401?
В настоящее время мой AJAX-вызов получает 401 как обычный сбойный запрос и не запрашивает браузер делать что-либо. Однако, если я беру один и тот же URI и вставляю его в строку URL-адреса браузера, возвращаемый 401 правильно запускает диалог базовой проверки подлинности.
Есть ли способ получить обратный вызов AJAX, чтобы сообщить браузеру открыть этот диалог?
Ответы
Ответ 1
Динамически создавать 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
}
});
Ответ 2
Вы не можете, вам нужно предоставить запрос с учетными данными.
См. Как использовать Basic Auth с jQuery и AJAX?
Ответ 3
Да, вы можете вызвать его из AJAX. Просто передайте запрос со следующим заголовком:
withCredentials: true
Ответ 4
Вы предложите открыть/отобразить/вставить форму, чтобы разрешить вставлять имя пользователя и пароль, а затем повторно отправить запрос AJAX с указанными учетными данными. Я бы не всплывал во всплывающем окне браузеров.
Как вы устанавливаете заголовок для проверки подлинности, который вы можете прочитать здесь: Как использовать Basic Auth с jQuery и AJAX?
Ответ 5
Я столкнулся с почти той же проблемой 401, за исключением того, что мой запрос был кросс-доменом. Но я надеюсь, что причина та же. Следуя инструкциям на developer.mozilla - Контроль доступа CORS Мне, наконец, удалось с простым:
var xhttp=new XMLHttpRequest();
xhttp.withCredentials = true;
xhttp.open("GET", "https://my.foo.server/app/resource", true);
xhttp.send();
Я думаю, что xhttp.withCredentials
- это решение. Это не заголовок! Вы разрешаете браузеру взаимодействовать с сервером через файлы cookie. Следующий ответ объясняет много XHR2 withCredentials - какие файлы cookie отправлены?
Без xhttp.withCredentials
всегда было 401 (Unauthorized)
. Но используя его, браузер добавил требуемый заголовок Authorization:Basic dGVFooFooFooFoosaWVudA==
или , вызвавший диалоговое окно входа в систему, когда учетные данные еще не были доступны.
Ответ 6
Как найдено где-то в стеке:
Получение ответа 401 - это сервер, сообщающий вам, "вы не являетесь аутентифицированный - либо не аутентифицированный вообще, либо аутентифицированный неверно, но повторите проверку и повторите попытку". Чтобы помочь вам, он всегда будет включать заголовок WWW-Authenticate, который описывает, как аутентифицировать
Использовать обратный вызов jQuery beforeSend
для добавления HTTP-заголовка с информацией об аутентификации
beforeSend: function (xhr) {
xhr.setRequestHeader ("Authorization", "Basic " + btoa(username + ":" + password));
},
Ответ 7
Согласны ли вы с условиями, указанными в этим ответом?
Также на основе в этом другом ответе вы можете проверить, что заголовки, возвращенные с вашего сервера, одинаковы независимо от того, запрашиваете ли вы его из браузера или из AJAX звоните.
Ответ 8
вы можете просто вызвать перенаправление при проверке состояния 401:
window.location = "https://example.com"