我有一个由我自己的 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 服务和客户端机器时钟是同步的。此外,服务和客户端位于加入域的两台不同机器上。