27

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

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

如何确定是否使用了 NTLM 或 Kerberos?是否有可能以某种方式解码“WWW-Authenticate: Negotiate”标头?

4

4 回答 4

43

你会在这里找到答案。

简短的回答是:

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...
于 2013-09-09T15:06:15.450 回答
7

解析 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 来确定机制。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 是(引用自此博客):

1.3.6.1.4.1.311.2.2.10 (NLMP NTLM)
于 2011-07-14T19:17:40.910 回答
0

如果服务器向用户 Negotiate 做广告,您可以自由使用 Kerberos,SPNEGO 支持 NTLM 或某些东西。但是,不能保证服务器支持客户端发送的每个包装的身份验证方法。

于 2011-07-14T16:52:17.130 回答
0

是的; 只需 Base64 解码,您将看到“NTLM”或“HTTP”。

C#

v = BitConverter.ToString(Convert.FromBase64String(v.Replace("Negotiate: ","")));
if (v.indexOf("NTLM") > -1) {
    //...
}
于 2017-08-16T11:15:12.180 回答