Подтвердить что ты не робот

Проверка подлинности 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
});
4b9b3361

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

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