具有 Windows 身份验证的 XMLHttpRequest SOAP 请求

XMLHttpRequest SOAP request with Windows Authentication

我正在尝试使用 XMLHttpRequest (firefox) 向 Microsoft 服务器发出 SOAP 请求,并在服务器上允许不同的身份验证方案。

var xmlhttp = new XMLHttpRequest();
xmlhttp.open('POST', url, true);
xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=UTF-8");
xmlhttp.setRequestHeader("Connection", "keep-alive");

xmlhttp.onreadystatechange = function () {
    if (xmlhttp.readyState == 4) {
        if (xmlhttp.status == 200) {
            alert(xmlhttp.responseText);
        }
    }
}

xmlhttp.send(soapRequest);

在这种情况下,一切都按预期进行。当我 运行 这段代码时,系统会提示我输入用户名和密码,输入凭据后我会从服务器得到响应。这适用于基本、摘要和 Windows 身份验证。

但我不想收到输入凭据的提示,所以我将第二行更改为

xmlhttp.open('POST', url, true, username, password);

现在这仅适用于基本和摘要身份验证,但不适用于 Windows Auth (NTLM)。我将从服务器收到 401 响应,这在使用此身份验证方法时很好,但不会发生进一步的通信。

我也尝试将域添加到 "network.automatic-ntlm-auth.trusted-uris" 首选项,但没有帮助。

服务器的完整响应:

Cache-Control private
Content-Length 0
Date Fri, 07 Jul 2017 16:48:22 GMT
Server Microsoft-IIS/7.5
WWW-Authenticate Negotiate
                 NTLM
X-AspNet-Version 2.0.50727
X-Powered-By ASP.NET

原来响应中的Negotiate header是麻烦制造者。当我将服务器上的 Windows 身份验证提供程序更改为 NTLM 而不是 Neogotiate,NTLM 时,它就可以工作了。

但是,如果您无权访问服务器,则需要在进一步处理之前以某种方式修改客户端的响应 header(从 WWW-Authenticate 中删除协商)。