Что такое 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/
Способ посмотреть на это:
- Первоначально Microsoft придумала способ аутентификации на серверах / машинах Windows, который они называли NTLM, при этом использовался метод запрос / ответ (иногда называемый запросом).
- Впоследствии они придумали новый протокол под названием Kerberos, который был принят.
- Чтобы убедиться, что все существующие приложения работают должным образом со старым / новым, у нас есть новый способ аутентификации под названием 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();