如何从WWW-Authenticate:Negotiate标头中查找是否使用NTLM或Kerberos

时间:2011-04-08 15:47:26

标签: .net kerberos ntlm negotiate www-authenticate

我正在编写.Net中的客户端应用程序,它通过HTTP与服务器通信。

我需要在NTLM和Kerberos授权的情况下设置不同的请求缓冲选项。

如何查明是否使用了NTLM或Kerberos?有可能以某种方式解码'WWW-Authenticate:Negotiate'标题?

4 个答案:

答案 0 :(得分:32)

您会找到答案here

简短回答是:

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

答案 1 :(得分:5)

解析Negotiate标题是一种繁琐的练习,因为它是使用ASN.1 DER构建的。

尽管如此,您可能不一定需要对此进行解码,以便对有效载荷做出良好的假设。虽然GSSAPI中有一个用于NTLM的机制(以下更多内容),根据我的经验,客户端实际上并没有使用它,它们只是发送NTLM头。在我(严格控制的)环境中,如果我看到Authorization: NTLM ...,那么这肯定是NTLM。如果我看到Authorization: Negotiate ...,那么这肯定是Kerberos。

严格地说,您应该查看标头中的机制列表,以确定该机制是NTLM还是Kerberos。我建议使用现成的ASN.1解码器,或者查看微软的decoding example。您将要查找SPNEGO OID(1.3.6.1.5.5.2),然后查找其中的机制类型序列。序列中的第一个机制对应于响应令牌有效负载,因此您可以查看该OID以确定机制。一些已知的Kerberos OID是:

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)

据我所知,NTLM的唯一OID是(引自this blog):

1.3.6.1.4.1.311.2.2.10 (NLMP NTLM)

答案 2 :(得分:0)

如果服务器向用户Negotiate通告您可以自由使用Kerberos,则SPNEGO支持NTLM或者某些内容。但是,无法保证服务器支持客户端发送的每个包装的auth方法。

答案 3 :(得分:0)

是;只需Base64解码就可以看到" NTLM"或" HTTP"。

C#

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