将NTLM凭据传递到远程Web服务

Mat*_*att 5 javascript c# iis jquery cross-domain

我想将NTLM凭据传递到远程Web服务。

我从rm1.domain.comJava脚本加载页面,并在其Javascript rm2.domain.com中调用了Web服务。

我希望所调用的Web服务能够读取进行调用的用户的NTLM凭据,但是我遇到了一些问题。

方案A(无效)

如果我的配置文件中包含以下内容:

 <webHttpEndpoint>
        <standardEndpoint name="" 
         automaticFormatSelectionEnabled="true" 
         crossDomainScriptAccessEnabled="true">
          <security>
            <transport clientCredentialType="Ntlm"></transport>
          </security>
       </standardEndpoint>
 </webHttpEndpoint>
Run Code Online (Sandbox Code Playgroud)

并且仅在IIS中启用了Windows身份验证,我得到了预期的结果:

在此处输入图片说明

方案B(无效)

我的配置文件中包含以下内容

<webHttpEndpoint>
  <standardEndpoint name="" automaticFormatSelectionEnabled="true">
      <security>
        <transport clientCredentialType="Ntlm"></transport>
      </security>
  </standardEndpoint>
</webHttpEndpoint>
Run Code Online (Sandbox Code Playgroud)

以及我的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);
    }
});
Run Code Online (Sandbox Code Playgroud)

并且仅在IIS中启用Windows身份验证,浏览器才会抛出:

如果我将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)凭据,并在我的后台代码中解析它们我的网络服务。

文档和大量选项令人不知所措。

Fle*_*rem 1

看看这个,其中有一些关于 NTLM 和模拟的使用的有趣观点。

HTTP 请求未经客户端身份验证方案“Ntlm”的授权

我知道您的问题不是 WCF 特有的,但其中一些观点与您的场景完全相关。

最后一条评论说“authenticationScheme 和 proxyAuthenticationScheme 到“Ntlm”对您来说很有趣。