【发布时间】:2016-07-27 19:34:23
【问题描述】:
我有一个使用 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 握手、密码协商和密钥交换,但我看不到字节。
发送第二条消息时没有相应的延迟,几秒钟后,所以我假设我有一个安全会话并且没有发送客户端的证书。
但自定义客户端证书验证器仍在被调用!
我到底做错了什么?!
【问题讨论】:
-
剧情变厚了!主机的 CustomCertificateValidator 在每条消息上都会被调用,因为使用 BasicHttpBinding 时,每次调用都会实例化一个新实例。所以实例上下文总是 PerCall 和 BasicHttpBinding。 WSHttpBinding 允许会话,但还有其他含义,所有客户端也需要更改。啊!
-
这是一次学习经历。绑定及其安全设置对服务实例行为施加控制。带有证书凭据的 BasicHttpBinding 将协商一次 SSL 握手,但您仍然会在每次调用时获得一个新的服务实例。这很烦人,特别是如果您想跟踪和报告连接和断开连接,但并不可怕,只要您的服务实例对象是轻量级的。 WSHttpBinding 将协商一次 SSL 握手并保留服务实例。其他绑定可能有自己独特的行为。
标签: c# wcf ssl servicehost