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

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

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

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

Ответы [ 4 ]

32 голосов
/ 09 сентября 2013

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

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

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

Not Kerberos:

Authorization: Negotiate TlRMTVNTUA...
5 голосов
/ 14 июля 2011

Синтаксический анализ заголовка 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)
0 голосов
/ 16 августа 2017

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

C #

v = BitConverter.ToString(Convert.FromBase64String(v.Replace("Negotiate: ","")));
if (v.indexOf("NTLM") > -1) {
    //...
}
0 голосов
/ 14 июля 2011

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

...