Проверка подлинности Javascript/Ajax NTLM
Я разрабатываю мобильное приложение HTML5, которое обменивается данными с WebServices
. WebServices использует протокол проверки подлинности NTLM. У меня возникли трудности с обработкой рукопожатия с помощью JavaScript. NTLM отправляет 401 unauthorized
в качестве ответа на мой POST, на который я не нашел ответа.
Возможно ли аутентификация NTLM с помощью JavaScript? Должен ли я создавать прокси-веб-службу, например. базовая аутентификация между ними?
Мой вызов jQuery - это что-то вроде...
$.ajax({
type: "POST",
url: URL,
contentType: "text/xml",
dataType: "xml",
data: soapRequest,
username: 'username',
password: 'password',
xhrFields: {
withCredentials: true
},
success: processSuccess,
error: processError
});
Ответы
Ответ 1
Насколько я понял, никто не реализовал аутентификацию Windows Integrated/NTLM с AJAX, хотя это должно быть возможно (я рассматриваю возможность сделать это для текущего проекта, чтобы объединить проверку подлинности с WindowsTokenRoleProvider)
Основной рабочий процесс должен разбиться как это (на основе статей здесь и здесь):
- выполните запрос GET с сообщением NTLM типа 1 с кодировкой base64 в
Заголовок "Авторизация"
- взять сообщение NTLM типа 2 с кодировкой base64
из заголовка "WWW-Authenticate" в ответе 401.
- выполнить операцию NTLM в noonce, полученную на предыдущем шаге (извините, у меня еще нет примера кода)
- выполнить окончательное GET с использованием NTLM-кода типа base-3 в заголовке "Авторизация". Это должно вернуть 200.
NTLM auth over HTTP - это скорее реализация CHAP с использованием HTTP, чем разрешенный HTTP-запрос.
Я обновлю вас, если я действительно приму участие в реализации этого. Извините, я не мог больше помочь.
Ответ 2
Проблема заключается в том, что вы не можете получить зарегистрированный в настоящее время домен/пользователь через javascript (или если вы не можете найти решение).
Если вы уже знаете домен, имя пользователя и пароль, вы можете использовать что-то вроде https://github.com/erlandranvinge/ntlm.js/tree/master
Тем не менее, я думаю, что спуск этого метода для единого входа будет разочаровывающим в долгосрочной перспективе.
Мы закончили проверку подлинности NTLM в скрытом iframe и обратились к iframe через javascript.
Ответ 3
Да, NTLM не очень весело. Но вы можете попробовать это, https://github.com/tcr/node-ntlm/blob/master/README.md
Ответ 4
Вам не нужно отвечать на вызов NTLM (Integrated Windows Authentication), ваш браузер должен сделать это для вас, если он правильно настроен. Возможны и дополнительные осложнения.
Шаг 1 - Браузер
Убедитесь, что браузер может получать и отправлять ваши учетные данные с помощью веб-приложения NTLM или сразу же запуская программное обеспечение, которое вы разрабатываете.
Шаг 2 - атрибут JavaScript withCredentials
Полученная ошибка 401 Несанкционированная и описанные симптомы точно совпадают, когда мне не удалось установить атрибут 'withCredentials' в значение "true". Я не знаком с jQuery, но убедитесь, что ваша попытка установить этот атрибут выполняется.
Этот пример работает для меня:
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "https://localhost:44377/SomeService", true);
xhttp.withCredentials = true;
xhttp.send();
xhttp.onreadystatechange = function(){
if (xhttp.readyState === XMLHttpRequest.DONE) {
if (xhttp.status === 200)
doSomething(xhttp.responseText);
else
console.log('There was a problem with the request.');
}
};
Шаг 3 - Серверная сторона разрешает CORS (необязательно)
Я подозреваю, что основная причина заключается в том, что они разрабатывают один компонент на своей рабочей станции с другим компонентом, размещенным в другом месте. Это вызывает проблемы Проблемы с совместным использованием ресурсов (CORS). Существует два решения:
- Отключите CORS в своем браузере - хорошо для разработки, когда в конечном итоге ваша работа будет развернута в том же самом происхождении, что и ресурс, к которому обращается ваш код.
- Включить CORS на вашем сервере - есть достаточно чтения в более широком Интернете, но в основном это касается отправки заголовков, разрешающих CORS.
Короче говоря, чтобы включить CORS с учетными данными, вы должны:
- Отправьте заголовок "Access-Control-Allow-Origin", который соответствует началу обслуживаемой страницы... это не может быть "*"
- Отправить "Access-Control-Allow-Credentials" со значением "true"
Вот мой рабочий пример .NET в моем файле global.asax. Я думаю, его довольно легко увидеть, что происходит и переводить на другие языки, если это необходимо.
void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.HttpMethod == "OPTIONS")
{
Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
Response.AddHeader("Access-Control-Max-Age", "1728000");
Response.End();
}
else
{
Response.AddHeader("Access-Control-Allow-Credentials", "true");
if (Request.Headers["Origin"] != null)
Response.AddHeader("Access-Control-Allow-Origin" , Request.Headers["Origin"]);
else
Response.AddHeader("Access-Control-Allow-Origin" , "*"); // Last ditch attempt!
}
}