【发布时间】:2013-09-13 13:17:07
【问题描述】:
我想将 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 身份验证,浏览器才会抛出:
- 获取http://rm2.domain.com/getInfo?name=bobyouruncle 401 (未经授权)jquery-1.10.1.min.js:6
- XMLHttpRequest 无法加载
http://rm2.domain.com/getInfo?name=bobyouruncle。来源
http://rm1是 Access-Control-Allow-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) 凭据并在我的 web 服务的代码隐藏中解析它们。
文档和数量之多令人难以理解。
【问题讨论】:
-
“有没有办法让我的 Web 服务作为 IIS 匿名 [并且] 从浏览器传递域 (NTLM) 凭据” - 据我所知。跨度>
-
尝试将 ajax 更改为帖子。
标签: c# javascript jquery iis cross-domain