我有一个用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握手,密码协商和密钥交换,但我看不到字节。

c# - WCF ServiceHost似乎为每条消息调用CustomCertificateValidator-LMLPHP

几秒钟后,发送第二条消息时没有相应的延迟,因此我假设我拥有安全的会话,并且未发送客户端的证书。

c# - WCF ServiceHost似乎为每条消息调用CustomCertificateValidator-LMLPHP

但是自定义客户端证书验证器仍在被调用!

我到底在做什么错?

最佳答案

现在我们更好地了解了服务实例的行为,我们决定继续使用BasicHttpBinding绑定的行为。

我们希望记录由远程SSL客户端提供的证书的证书到期信息,但是当在每条消息上调用验证程序时,我们很难做到这一点。真可惜。

我们认为,在不更改所有客户端的绑定的情况下,更改服务的绑定也不是简单的方法。

我真的很喜欢WCF,但是对服务实例行为受绑定选择和安全性影响的方式的记录却很少。

09-26 09:28