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

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

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

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

4 ответа

Решение

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

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

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...

Не Керберос:

Authorization: Negotiate TlRMTVNTUA...

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

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

Строго говоря, вы должны посмотреть на список механизмов в заголовке, чтобы определить, был ли этот механизм NTLM или Kerberos. Я бы рекомендовал либо использовать готовый декодер ASN.1, либо посмотреть на пример декодирования Microsoft. Вы будете хотеть искать SPNEGO OID (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)

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

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

C#

v = BitConverter.ToString(Convert.FromBase64String(v.Replace("Negotiate: ","")));
if (v.indexOf("NTLM") > -1) {
    //...
}
Другие вопросы по тегам