Как вызвать диалог "Базовая аутентификация" браузера с помощью вызова 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
    }
});

Ответ 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"