我有一个用X509Certificate保护的WCF ServiceHost
Credentials.ServiceCertificate.Certificate = certificate;
和自定义客户端证书验证器:
Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.Custom;
Credentials.ClientCertificate.Authentication.CustomCertificateValidator = new CustomX509CertificateValidator();
InstanceContextMode和ConcurrencyMode是其默认值PerSession和Single。
我的端点使用传输安全性,并且需要客户端证书:
BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
AddServiceEndpoint(typeof(...), binding, endpoint);
我希望(并希望)自定义客户端证书验证程序在新连接的SSL握手期间被调用一次,但是在收到的每条消息上都会调用它。
客户端WCF跟踪日志显示大量流量,包括发送第一条消息时的4秒钟延迟,我假设这是SSL握手,密码协商和密钥交换,但我看不到字节。
几秒钟后,发送第二条消息时没有相应的延迟,因此我假设我拥有安全的会话,并且未发送客户端的证书。
但是自定义客户端证书验证器仍在被调用!
我到底在做什么错?
最佳答案
现在我们更好地了解了服务实例的行为,我们决定继续使用BasicHttpBinding绑定的行为。
我们希望记录由远程SSL客户端提供的证书的证书到期信息,但是当在每条消息上调用验证程序时,我们很难做到这一点。真可惜。
我们认为,在不更改所有客户端的绑定的情况下,更改服务的绑定也不是简单的方法。
我真的很喜欢WCF,但是对服务实例行为受绑定选择和安全性影响的方式的记录却很少。