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绑定的场景:
在客户端端点中没有指定 <identity>
元素 - WCF 调用失败
提供了<identity>
元素,但 dns、userPrioncipalName 或 servicePrincipalName 元素的值为空 - WCF 调用成功,但使用 Ntlm 身份验证
<identity>
元素提供了 dsn 或 SPN 的值 - WCF 调用成功;服务使用 Ntlm 进行身份验证。
<identity>
元素为 upn 提供了正确的值 - WCF 调用成功;服务使用 Kerberos 进行身份验证。 upn 触发 Ntlm 身份验证的值不正确或缺失
谢谢。
【讨论】:
【参考方案2】:Net TCP 绑定不支持“NTLM”作为客户端凭据类型 - 您只能选择 None
、Windows
或 Certificate
(请参阅 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?的主要内容,如果未能解决你的问题,请参考以下文章
.NET HttpClient 在使用 NTLM 协商时不会在对 IIS 的请求之间保持身份验证