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

时间:2017-07-06 10:48:28

标签: javascript authentication firefox xmlhttprequest ntlm

我正在尝试使用XMLHttpRequest(firefox)向服务器发出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);

在这种情况下,一切都按预期工作。当我运行此代码时,系统会提示输入用户名和密码,输入凭据后我会收到服务器的响应。这适用于Basic,Digest和Windows身份验证。

但我不想提示输入凭证,所以我将第二行改为

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

现在这仅适用于Basic和Digest身份验证,但不适用于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

1 个答案:

答案 0 :(得分:1)

事实证明,响应标题中的Negotiate是麻烦制造者。当我将服务器上的Windows身份验证提供程序更改为NTLM而不是Neogotiate时,NTLM就可以了。

但是,如果您无法访问服务器,则需要以某种方式修改客户端上的响应标头(从WWW-Authenticate中删除Negotiate),然后再进行处理。