Как узнать, используется ли NTLM или Kerberos из WWW-Authenticate: заголовок для ведения переговоров

Я программирую клиентское приложение в .NET, которое общается с сервером через HTTP.

Мне нужно установить различные параметры буферизации запроса в случае авторизации NTLM и Kerberos.

Как узнать, используются ли NTLM или Kerberos? Возможно ли каким-то образом декодировать заголовок "WWW-Authenticate: Negotiate"?

Ответ 1

Здесь вы найдете ответ .

Короткий ответ:

1.Capture some successfully authorized request using Fiddler tool.
2.Choose "Inspectors" -> "Headers" tab.
3.Pay attention at "Cookies / Login" section, "Authorization" header.

Если токен авторизации начинается с "YII", то используется Kerberos, но если он начинается с "TlR", то Kerberos не используется.

Например, Kerberos:

Authorization: Negotiate YIIVDAYGKwYBE...

Не Kerberos:

Authorization: Negotiate TlRMTVNTUA...

Ответ 2

Разбор заголовка Negotiate является своего рода утомительным упражнением по его построению с использованием ASN.1 DER.

Тем не менее, вы, возможно, не обязательно должны декодировать это, однако, чтобы сделать хорошее предположение о полезной нагрузке. Хотя в GSSAPI есть механизм для NTLM (подробнее об этом ниже), по моему опыту клиенты фактически не используют его, они просто отправляют заголовки NTLM. В моей (по общему признанию, строго контролируемой) среде, если я вижу Authorization: NTLM ..., то это гарантируется как NTLM. Если я вижу Authorization: Negotiate ..., то это гарантированно будет Kerberos.

Строго говоря, вы должны посмотреть список механизмов в заголовке, чтобы определить, был ли этот механизм NTLM или Kerberos. Я бы рекомендовал либо использовать готовый декодер ASN.1, либо посмотреть на Microsoft пример декодирования. Вы захотите найти OID SPNEGO (1.3.6.1.5.5.2), а затем найдите последовательность типов механизмов внутри этого. Первый механизм в последовательности соответствует полезной нагрузке маркера ответа, поэтому вы можете посмотреть на этот OID, чтобы определить механизм. Некоторые известные OID для Kerberos:

1.2.840.113554.1.2.2 (Kerberos 5)
1.2.840.48018.1.2.2 (Microsoft Kerberos 5)
1.3.5.1.5.2 (Kerberos 5 OID 2)

Насколько мне известно, единственный OID для NTLM (ссылка из этот блог):

1.3.6.1.4.1.311.2.2.10 (NLMP NTLM)

Ответ 3

Если сервер объявляет пользователю Negotiate, вы можете использовать Kerberos, NTLM или что-то поддерживает SPNEGO. Хотя нет гарантии, что сервер поддерживает каждый завернутый метод auth, отправленный клиентом.

Ответ 4

Да; просто Base64 декодирует его, и вы увидите "NTLM" или "HTTP".

С#

v = BitConverter.ToString(Convert.FromBase64String(v.Replace("Negotiate: ","")));
if (v.indexOf("NTLM") > -1) {
    //...
}