В проекте, в котором я сейчас работаю, я решил использовать совершенно другой подход. У меня была аналогичная ситуация с аутентификацией NTLM, но я уверен, что для базовой проверки подлинности она также будет работать. Я написал простое расширение хром, которое использует прослушиватель на chrome.webRequest.onAuthRequired
. Кроме того, добавив дополнительные методы в сценарий контента для связи с фоновым скриптом, мне удалось изменить учетные данные «на лету», не заботясь о раздражающих окнах.
background.js:
var CurrentCredentials = {
user: undefined,
password: undefined
}
chrome.runtime.onMessage.addListener(function(request) {
if(request.type === 'SET_CREDENTIALS') {
CurrentCredentials.user = request.user;
CurrentCredentials.password = request.password;
}
});
chrome.webRequest.onAuthRequired.addListener(function(details, callback) {
if(CurrentCredentials.user !== undefined && CurrentCredentials.password !== undefined) {
return {authCredentials:
{
username: CurrentCredentials.user,
password: CurrentCredentials.password
}
};
}
}, {urls: ["http://my-server/*"]}, ["blocking"]);
и контент-script.js:
var port = chrome.runtime.connect();
window.addEventListener("message", function(event) {
if (event.source !== window)
return;
if (event.data.type && (event.data.type === 'SET_CREDENTIALS')) {
chrome.runtime.sendMessage({
type: 'SET_CREDENTIALS',
user: event.data.user,
password: event.data.password
});
}
}, false);
Удлинитель должен быть упакован, как CRX и добавляют к ChromeOptions до инициализации драйвера. Кроме того, требуется установить учетные данные перед фактическим вызовом на сайт, которому требуется аутентификация, поэтому я просматриваю простой файл html на диске и размещаю хром-сообщение, находясь на странице: window.postMessage({type: 'SET_CREDENTIALS', user: arguments[0], password: arguments[1]}, '*')
с использованием метода IJavascriptExecutor.ExecuteScript
. После того, как это будет сделано, окно проверки подлинности не появится, и пользователь выполнит аутентификацию, как ожидалось.