Got a simple WCF demo app that has two console projects--host and client. Both are running on my machine (win 7 box). I'm using the netTcpBinding, which uses windows authentication.
The issue is that authentication is downgrading to NTLM from kerberos, and I can't figure out why.
If I use
<clientCredentials>
<windows allowNtlm="true" />
</clientCredentials>
on the client side, everything is cool. But if I change that to false
, I get the following exception:
SecurityNegotiationException: The remote server did not satisfy the mutual authentication requirement.
This suggests that kerberos is failing and since the client won't allow NTLM the call results in an exception being thrown.
Is this an issue with the project, or is it an external issue caused by the configuration of my development machine?
Solution:
Apparently, I have to specify the identity of the server within the client configuration. In my case, the server is running under my identity, so I modify the client thusly:
<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>
I'm not sure why this fixes the issue. Okay, now on the client side I fully trust the server (hey, I know that guy!). But since NTLM is less secure than kerberos, why isn't it the other way around? If I don't fully trust the server, I use kerberos, otherwise ntlm is fine.
Or, OTOH, if I don't fully trust the server why does it work at all? "SecurityException: Endpoint identity not set. WCF cannot trust the identity of the server and will not transmit client identity."