我有一个使用 Windows 身份验证的 Web 应用程序,它使用我们 Intranet 上不同服务器上的 Windows 身份验证来调用 Web 服务。具体来说,我正在使用带有 SSL 的 jQuery 跨域对 WCF 休息服务 ( WebHttpBinding
) 进行 ajax 调用。
我通过在 Web 服务中设置 Access-Control-Allow-Origin 标头解决了跨域问题。并在 jquery 中调用 ie 通过设置$.support.cors = true;
.
我通过设置标头解决了发送凭据的问题("Access-Control-Allow-Credentials", "true")
;在 Web 服务和 jQuery 调用中通过设置
$.ajaxSetup({ xhrFields: { withCredentials: true, crossDomain: true
}
});
我让这适用于 IE 和 Chrome,使用在不同服务器上运行的 Windows 身份验证从 Web 应用程序使用 Windows 身份验证对 Web 服务进行跨域。但是,当我将 SSL 添加到双方(https 到 https)时,该调用在 IE 中不再有效。它继续在 Chrome 中工作。
查看 Fiddler 中的 http 流量,浏览器似乎甚至没有发出请求,也就是说,Fiddler 根本没有显示请求已发出的条目。通过调试 javascript,我可以捕获从 jquery 调用返回的错误,并且状态文本是“访问被拒绝”。但正如我所说,在我看来,浏览器甚至没有将请求发送到 Web 服务。
我尝试了一个 jquery cors 插件jQuery.XDomainRequest.js
。那时我开始在 fiddler 中看到 http 调用。这是一个单一的 401“拒绝访问”。就是这样。客户端调用似乎没有发送任何凭据。
在此之前,在我添加 SSL 之前,我会看到一个 401,其中包含身份验证凭据的响应标头。随后是 200,其中请求标头包含 Windows 身份验证凭据。所以它奏效了。
但是现在(在 IE 中)我只得到了单个 401。所以我被卡住了,我需要打电话
- 跨域,
- 使用 Windows 身份验证,
- 使用 SSL 和
- 与 IE。
我可以把所有四个要求结合在一起。我很困惑为什么我可以使用 windows auth 跨域来使用 IE,但是当我添加 SSL 时我无法让它工作。
它在 Chrome 中运行良好,因此它必须与 XDomainRequest 对象有关。有什么方法可以调整 jQuery 调用以使这一切正常工作。有没有人听说过这个特定的问题?这是可以克服的吗?还是我只是把头撞在墙上?