我有一个简单的WCF演示应用程序,其中包括两个控制台项目-主机和客户端。两者都在我的机器上运行(win 7框)。我正在使用netTcpBinding,它使用Windows身份验证。
问题在于身份验证从kerberos降级到NTLM,我无法弄清原因。
如果我使用
<clientCredentials>
<windows allowNtlm="true" />
</clientCredentials>
在客户端,一切都很好。但是如果我将其更改为
false
,则会出现以下异常:
这表明kerberos失败了,由于客户端不允许NTLM,所以调用结果会导致抛出异常。SecurityNegotiationException:远程服务器未满足相互身份验证要求。
这是项目的问题还是由于开发机器的配置而引起的外部问题?
解决方案:
显然,我必须在客户端配置中指定服务器的身份。在我的情况下,服务器正在我的身份下运行,因此我这样修改了客户端:
<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就可以。或者说,另一方面,如果我不完全信任服务器,为什么它还能正常工作呢?"SecurityException: Endpoint identity not set. WCF无法信任服务器的身份,也不会传输客户端的身份。"