Что такое NTLM / Аутентификация / Согласование веб-аутентификации - PullRequest
0 голосов
/ 26 марта 2019

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

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

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

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

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

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

1 Ответ

2 голосов
/ 26 марта 2019

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

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

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

В настоящее время пакет безопасности согласования выбирает между 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();  
...