2017-07-06 76 views
0

我正尝试使用XMLHttpRequest(firefox)在服务器上允许的不同身份验证方案向Microsoft服务器发出SOAP请求。使用Windows身份验证的XMLHttpRequest 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身份验证。

但我不希望得到提示credetntials所以我改变了第二行

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

现在,这仅适用于基本和摘要式身份验证,而不是Windows验证(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 

回答

0

原来,在响应头协商是麻烦制造者。当我将服务器上的Windows身份验证提供程序更改为NTLM而不是Neogotiate时,NTLM即可使用。

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