如果配置正确,您的浏览器应该为您响应NTLM(集成Windows身份验证)挑战,您不必自己回应。此外可能会有其他一些复杂情况。
第一步-浏览器
首先确保浏览器可以通过访问NTLM Web应用程序或者直接访问您正在开发的软件来发送您的凭据。
第二步-JavaScript withCredentials属性
当我没有将“withCredentials”属性设置为“true”时,我收到了401未经授权错误并描述了相同的症状。我不熟悉jQuery,但请确保您设置该属性的尝试成功。
以下示例对我有效:
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "https://localhost:44377/SomeService", true);
xhttp.withCredentials = true;
xhttp.send();
xhttp.onreadystatechange = function(){
if (xhttp.readyState === XMLHttpRequest.DONE) {
if (xhttp.status === 200)
doSomething(xhttp.responseText);
else
console.log('There was a problem with the request.');
}
};
第三步 - 服务器端启用CORS(可选)
我猜很多人会遇到这个问题是因为他们正在本地开发一个组件,但该组件需要访问另一个位置托管的组件。这就引起了跨域资源共享(CORS)的问题。解决方案有两种:
- 在你的浏览器中禁用CORS - 开发时很好用,最终当你的工作部署在同一起源作为你的代码正在访问的资源上时。
- 在你的服务器上启用CORS - 在更广泛的互联网上有大量的阅读材料,但基本上涉及发送启用CORS的头文件信息。
简而言之,要启用CORS带凭据,您必须:
- 发送匹配已服务页面的起源的 'Access-Control-Allow-Origin' 头文件 ... 不能是“*”
- 发送值为'true'的 'Access-Control-Allow-Credentials'
这是我的.NET代码示例,在我的global.asax文件中可以工作。如果需要,我认为很容易看出正在发生什么并将其翻译成其他语言。
void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.HttpMethod == "OPTIONS")
{
Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
Response.AddHeader("Access-Control-Max-Age", "1728000");
Response.End();
}
else
{
Response.AddHeader("Access-Control-Allow-Credentials", "true");
if (Request.Headers["Origin"] != null)
Response.AddHeader("Access-Control-Allow-Origin" , Request.Headers["Origin"]);
else
Response.AddHeader("Access-Control-Allow-Origin" , "*");
}
}