ホストとクライアントの2つのコンソールプロジェクトを持つ単純なWCFデモアプリを入手しました。両方とも私のマシンで実行されています(7ボックスに勝ちます)。Windows認証を使用するnetTcpBindingを使用しています。
問題は、認証がKerberosからNTLMにダウングレードされていることであり、その理由がわかりません。
使用する場合
<clientCredentials>
<windows allowNtlm="true" />
</clientCredentials>
クライアント側では、すべてがクールです。しかし、これをに変更するとfalse
、次の例外が発生します。
SecurityNegotiationException:リモートサーバーが相互認証要件を満たしていませんでした。
これは、Kerberosが失敗しており、クライアントがNTLMを許可しないため、呼び出しによって例外がスローされることを示しています。
これはプロジェクトの問題ですか、それとも開発マシンの構成に起因する外部の問題ですか?
解決:
どうやら、クライアント構成内でサーバーのIDを指定する必要があります。私の場合、サーバーは私のIDで実行されているので、次のようにクライアントを変更します。
<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:エンドポイントIDが設定されていません。WCFはサーバーのIDを信頼できず、クライアントIDを送信しません。」