有一个简单的 WCF 演示应用程序,它有两个控制台项目——主机和客户端。两者都在我的机器上运行(win 7 box)。我正在使用 netTcpBinding,它使用 Windows 身份验证。
问题是身份验证从 kerberos 降级到 NTLM,我不知道为什么。
如果我使用
<clientCredentials>
<windows allowNtlm="true" />
</clientCredentials>
在客户端,一切都很酷。但是,如果我将其更改为false
,则会出现以下异常:
SecurityNegotiationException:远程服务器不满足相互身份验证要求。
这表明 kerberos 失败,并且由于客户端不允许 NTLM,因此调用会导致引发异常。
这是项目的问题,还是我的开发机器配置造成的外部问题?
解决方案:
显然,我必须在客户端配置中指定服务器的身份。就我而言,服务器以我的身份运行,因此我修改了客户端:
<client>
<endpoint address="net.tcp://dev7.HurrDurr.com:12345/MyService"
binding="netTcpBinding"
bindingConfiguration="MyBindingConfigurationLol"
behaviorConfiguration="HurrDurrServiceEndpoint"
contract="ShaolinCore.ICommunicationService">
<!-- start changes here -->
<identity>
<userPrincipalName value="myusername@mydomain"/>
</identity>
<!-- end changes here -->
</endpoint>
</client>
我不确定为什么这可以解决问题。好的,现在在客户端我完全信任服务器(嘿,我认识那个人!)。但是既然 NTLM 不如 kerberos 安全,为什么不反过来呢?如果我不完全信任服务器,我使用 kerberos,否则 ntlm 很好。
或者,OTOH,如果我不完全信任服务器,为什么它根本工作?“SecurityException:未设置端点身份。WCF 无法信任服务器的身份,不会传输客户端身份。”