WCF - 如何为 NTLM 身份验证配置 netTcpBinding?

Posted

技术标签:

【中文标题】WCF - 如何为 NTLM 身份验证配置 netTcpBinding?【英文标题】:WCF - How to configure netTcpBinding for NTLM authentication? 【发布时间】:2011-01-13 09:31:06 【问题描述】:

我知道如何为 NTLM 身份验证配置 basicHttpBinding,但不知道如何为 netTcpBinding 做同样的事情。

netTcpBinding 是否支持 NTLM?如果是,如何强制 WCF 服务使用 NTLM?

顺便说一句,由于某种原因,一种众所周知的使用标识元素的方法根本不起作用。我正在寻找这样的东西 - clientCredentialType ="Ntlm" 但对于 tcp。 这是基本的Http设置:

<basicHttpBinding>
  <binding name="BasicHttpBinding">
  <security mode ="TransportCredentialOnly">
  <transport clientCredentialType ="Ntlm"/>
  </security>
  </binding>
</basicHttpBinding>

【问题讨论】:

如果您想包含代码或 XML 的 sn-ps(例如配置),您需要在帖子中突出显示这些行,然后使用编辑器工具栏上的“代码”按钮 (101 010) (或按键盘上的 Ctrl-K)使它们格式化并突出显示语法。否则,您的帖子真的很难阅读,XML 甚至都不会出现! 【参考方案1】:

这是我最终找到、测试和确认的综合答案。

A.我的 WCF 客户端用于动态构建 EndPoint.Address,如下所示

EndPointAddress  myEdpintAddress = new EndPointAddress(stringURL);

但在安全传输 (net.tcp) 的情况下,它必须按如下方式初始化 EndPointAddress myEdpintAddress = new EndPointAddress(new UrRL(string), myEndPointIdentity)

如果没有 EndPointIdentity 参数,EndPointAddress 对象中的 Identity 属性为空,并在服务器端生成“...目标主体名称不正确...”错误。

B.我们的域控制器支持 Kerberos 和 Ntlm 身份验证。完成上述操作后,如果安全性不是“None”,并且WCF服务以域帐户运行,则客户端一般有四种配置net.tcp绑定的场景:

    在客户端端点中没有指定 &lt;identity&gt; 元素 - WCF 调用失败

    提供了&lt;identity&gt; 元素,但 dns、userPrioncipalName 或 servicePrincipalName 元素的值为空 - WCF 调用成功,但使用 Ntlm 身份验证

    &lt;identity&gt; 元素提供了 dsn 或 SPN 的值 - WCF 调用成功;服务使用 Ntlm 进行身份验证。

    &lt;identity&gt; 元素为 upn 提供了正确的值 - WCF 调用成功;服务使用 Kerberos 进行身份验证。 upn 触发 Ntlm 身份验证的值不正确或缺失

谢谢。

【讨论】:

【参考方案2】:

Net TCP 绑定不支持“NTLM”作为客户端凭据类型 - 您只能选择 NoneWindowsCertificate(请参阅 MSDN docs on TcpClientCredentialType)。

所以在你的情况下,试试这个:

<netTcpBinding>
  <binding name="tcpWindows">
    <security mode ="TransportCredentialOnly">
      <transport clientCredentialType ="Windows"/>
    </security>
  </binding>
</netTcpBinding>

这不起作用的任何原因?

【讨论】:

谢谢你 marc_s。这是我首先尝试用于 tcp 绑定的方法,但它不起作用 - 它不强制 NTLM。从事件查看器中,我可以看到它仍在尝试使用未在环境中配置的 Kerberos。因此服务调用失败。如果我指定服务器机器的 IP 地址而不是全名(主机名加域),它会很有趣。在这种情况下,它确实使用了 NTLM。我可以从事件查看器中看到它。

以上是关于WCF - 如何为 NTLM 身份验证配置 netTcpBinding?的主要内容,如果未能解决你的问题,请参考以下文章

WCF 身份验证错误

为啥 kerberos 在 WCF 中默认为 NTLM?

在声明环境中正确地针对 WCF 服务进行身份验证

.NET HttpClient 在使用 NTLM 协商时不会在对 IIS 的请求之间保持身份验证

BizTalk 发送端口与 NTLM 身份验证和自定义用户和密码

401 客户端“协商”,服务器“协商,NTLM”在调用 WCF 服务器到服务器时