私は、独自の Windows アプリケーションによってホストされている WCF サービスを持っています。サービスがクライアントの証明書を使用してトランスポート レベルでクライアントを認証するようにしたいのですが、クライアントがサービスと通信するときに、クライアントのユーザー アカウントの Kerberos チケットを渡す必要があります。インターネットを見回すと、サービスの次の構成が見つかりました。
<bindings>
<customBinding>
<binding name="Kerberos (MsgHeader) over Transport (Certificate)">
<textMessageEncoding messageVersion="Soap11" />
<security authenticationMode="KerberosOverTransport">
<secureConversationBootstrap />
</security>
<httpsTransport requireClientCertificate="true" />
</binding>
</customBinding>
</bindings>
彼らは、この構成はマイクロソフトの助けを借りて機能したと言います。ここで、コードを使用してこの構成を複製しようとしたため、次のスニペットを使用しました。
BindingElementCollection elementCollection = new BindingElementCollection();
elementCollection.Add(SecurityBindingElement.CreateKerberosOverTransportBindingElement());
elementCollection.Add(new TextMessageEncodingBindingElement() { MessageVersion = MessageVersion.Soap11 });
elementCollection.Add(new HttpsTransportBindingElement() { RequireClientCertificate = true });
return new CustomBinding(elementCollection);
ポートにバインドされた有効な証明書とともに、このバインディングを使用してエンドポイントを構成しました。次に、Visual Studio のクライアント プロジェクトにサービス参照を追加しました。
この目的のために、すべてがうまく機能しています!また、サービスと通信するときに証明書を送信するようにクライアントを構成しましたが、これも正常に機能しました。ただし、サービスのメソッドを呼び出そうとすると、次のエラーが発生します。
保護されていない、または誤って保護された障害が相手から受信されました。障害コードと詳細については、内部の FaultException を参照してください。
内部例外を調べたところ、次のエラーが見つかりました。
メッセージ内のセキュリティ トークンの処理中にエラーが発生しました。
何か助けてください。Kerberos トークンを送信するようにクライアントをさらに構成する必要がありますか?
PS サービスとクライアント マシンのクロックは同期されます。さらに、サービスとクライアントは、ドメインに参加している 2 つの異なるマシン上にあります。