Что такое NTLM/ Аутентификация / Согласование веб-аутентификации

Я понимаю основную и дайджест-аутентификацию. Но я много искал и борюсь с NTLM, Authenticate и Negotiate.

Я думаю, поправьте меня, если я ошибаюсь, что NTLM и Authenticate - это два термина для одного и того же протокола.

И переговоры сначала пытаются NTLM, затем возвращаются к дайджесту, а затем возвращаются к основному соединению.

Это верно? И если да, то где хороший пример того, как подключиться в C# как для NTLM, так и для переговоров.

У меня есть два варианта использования. Во-первых, мне нужно вытащить один файл. Итак, сделайте запрос, получите XML-файл в качестве ответа, прочитайте его, готово.

Второй - это запрос к OData от сотен до тысяч веб-запросов, каждый из которых будет предоставлять JSON (или XML) в качестве ответа.

1 ответ

Решение

Microsoft Negotiate является поставщиком поддержки безопасности (SSP), который действует как прикладной уровень между интерфейсом поставщика поддержки безопасности (SSPI) и другими поставщиками общих служб. Когда приложение вызывает SSPI для входа в сеть, оно может указать SSP для обработки запроса. Если приложение указывает Negotiate, Negotiate анализирует запрос и выбирает лучшего поставщика общих служб для обработки запроса на основе настроенной клиентом политики безопасности.

https://docs.microsoft.com/en-us/windows/desktop/secauthn/microsoft-negotiate

Как указано в статье, переговоры не отступают, чтобы переварить. В каком-то смысле Negotiate похож на Kerberos, но с резервной копией NTLM по умолчанию

В настоящее время пакет безопасности Negotiate выбирает между Kerberos и NTLM. При согласовании выбирается Kerberos, если только он не может использоваться одной из систем, участвующих в аутентификации, или вызывающее приложение не предоставило достаточной информации для использования Kerberos.

Windows Challenge / Response (NTLM) - это протокол аутентификации, используемый в сетях, которые включают системы с операционной системой Windows и в автономных системах.

Аутентификация - это только внутренний метод, не знаю, почему вы путаетесь с ней и протоколами, здесь вы можете посмотреть подробности: https://blogs.msdn.microsoft.com/dsnotes/2015/12/30/negotiate-vs-ntlm/

Способ посмотреть на это:

  1. Первоначально Microsoft придумала способ аутентификации на серверах / машинах Windows, который они называли NTLM, при этом использовался метод запрос / ответ (иногда называемый запросом).
  2. Впоследствии они придумали новый протокол под названием Kerberos, который был принят.
  3. Чтобы убедиться, что все существующие приложения работают должным образом со старым / новым, у нас есть новый способ аутентификации под названием Negotiate, который пробовал Kerberos и, если он недоступен, применяется для NTLM.

Редактировать 1: Применение этих механизмов аутентификации для Интернета было формализовано в RFC 4559.

Редактировать 2: NTLM аутентифицирует одно соединение, а не запрос, в то время как другие механизмы аутентификации обычно аутентифицируют один запрос. В первом случае это не должно сильно меняться, но во втором случае имеет смысл попробовать NTLM, сохраняя одно соединение (используя HTTP Keep-Alive и отправляя учетные данные только один раз в первом запросе). Там может быть разница в производительности. Держите нас в курсе ваших результатов.

Пример кода WebRequest, взятый из документации Microsoft, можно заменить Webrequest на HttpWebRequest.

            // Create a request for the URL.   
            WebRequest request = WebRequest.Create(  
              "http://www.contoso.com/default.html");  
            // If required by the server, set the credentials.  
            request.Credentials = CredentialCache.DefaultCredentials;  
            // Get the response.  
            WebResponse response = request.GetResponse();  
            // Display the status.  
            Console.WriteLine (((HttpWebResponse)response).StatusDescription);  
            // Get the stream containing content returned by the server.  
            Stream dataStream = response.GetResponseStream();  
            // Open the stream using a StreamReader for easy access.  
            StreamReader reader = new StreamReader(dataStream);  
            // Read the content.  
            string responseFromServer = reader.ReadToEnd();  
            // Display the content.  
            Console.WriteLine(responseFromServer);  
            // Clean up the streams and the response.  
            reader.Close();  
            response.Close();  
Другие вопросы по тегам