Как определить, используется ли 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) {
//...
}