我想将 NTLM 凭据传递给远程 Web 服务。
rm1.domain.com
我从它的 Javascript加载我的页面,然后rm2.domain.com
调用一个 web 服务。
我希望被调用的 Web 服务能够读取进行调用的用户的 NTLM 凭据,但我遇到了一些问题。
方案 A(不起作用)
如果我的配置文件中有以下内容:
<webHttpEndpoint>
<standardEndpoint name=""
automaticFormatSelectionEnabled="true"
crossDomainScriptAccessEnabled="true">
<security>
<transport clientCredentialType="Ntlm"></transport>
</security>
</standardEndpoint>
</webHttpEndpoint>
并且仅在 IIS 中启用了 Windows 身份验证,我得到了预期:
场景 B(不起作用)
我的配置文件中有以下内容
<webHttpEndpoint>
<standardEndpoint name="" automaticFormatSelectionEnabled="true">
<security>
<transport clientCredentialType="Ntlm"></transport>
</security>
</standardEndpoint>
</webHttpEndpoint>
以及我的 JavaScript 中的以下内容:
jQuery.ajax({
url: "http://rm2.domain.com/getInfo?name=bobsyouruncle,
dataType: "json",
async: false,
success: function(data) {
console.log('woot');
},
error: function(ex) {
console.log(ex);
}
});
并且仅在 IIS 中启用了 Windows 身份验证,浏览器会抛出:
- GET http://rm2.domain.com/getInfo?name=bobyouruncle 401(未经授权)jquery-1.10.1.min.js:6
- XMLHttpRequest 无法加载
http://rm2.domain.com/getInfo?name=bobyouruncle。Access-Control-Allow- Origin
http://rm1
不允许 Origin。jquery-1.10.1.min.js:6
如果我将 JavaScript 更改为 JSONP,那么我也什么也得不到,但这并不意外,因为我从 web.config 中删除了 crossDomainScriptAccessEnabled="true" 。但正如您将在场景 C 中看到的那样,您不能在启用身份验证方案的情况下启用crossDomainScriptAccessEnabled="true" 。
场景 C(不会通过凭据)
如果mr2的web服务的web.config类似场景B,IIS匿名认证开启(windows认证关闭),jQuery请求JSONp,则服务返回数据,但认证信息不通过。
底线 (TL;DR) 有没有办法让我的 web 服务保持匿名 IIS,在其 web.config 中使用跨域标记,从浏览器传递域 (NTLM) 凭据并在我的代码隐藏中解析它们我的网络服务。
文档和选项的绝对数量是压倒性的和令人困惑的。