我们有一个需要与之通信的客户端,他们的 API 页面仅支持 NTLM 身份验证。 我们的网站运行经典的 ASP (jScript),因此请原谅语法与您通常使用 VB 所期望的略有不同。 他们向我们提供了用户/密码/域详细信息,让我们可以连接到他们。
我正在使用的是(我还注释掉了我尝试过的其他一些选项):
var oXmlHTTP = Server.CreateObject("Msxml2.ServerXMLHTTP.6.0");
oXmlHTTP.open("GET", "EXTERNAL_URL", false, "THEIR_DOMAIN\THEIR_USER", "PASSWORD");
//var strB64 = base64_encode("THEIR_DOMAIN\THEIR_USER" + ":" + "PASSWORD");
//oXmlHTTP.setRequestHeader("Authenticate", "NTLM "+strB64);
//oXmlHTTP.setRequestHeader("Authorization", "NTLM "+strB64);
//oXmlHTTP.setRequestHeader("WWW-Authenticate", "NTLM "+strB64);
oXmlHTTP.send();
Response.write(oXmlHTTP.getAllResponseHeaders());
我得到的响应是一个 401 未经授权的标头,在尝试了很多事情并深入研究使用wireshark真正进行的请求之后,我可以看到以下 3 个连接:
78 3.003575 MY_IP THEIR_IP HTTP 320 GET EXTERNAL_URL HTTP/1.1
83 3.031194 MY_IP THEIR_IP HTTP 398 GET EXTERNAL_URL HTTP/1.1 , NTLMSSP_NEGOTIATE
85 3.061152 MY_IP THEIR_IP HTTP 1014 GET EXTERNAL_URL HTTP/1.1 , NTLMSSP_AUTH, User: MYLOCALDOMAIN\THEIR_DOMAINTHEIR_USER
所以它所做的就是从我提供的用户名中删除反斜杠并将我的本地计算机域添加到请求中,我确信这是因为它是 Windows 身份验证方法的一种形式,但我们不是他们域的一部分,所以有什么方法可以强制它使用我提供的域名吗?
我一发布这篇文章,我就有了一个疯狂的想法......
oXmlHTTP.open("GET", "EXTERNAL_URL", false, "THEIR_DOMAIN\\THEIR_USER", "PASSWORD");
域名和用户名之间的额外斜杠修复了这个问题。