【问题标题】:WCF ServiceHost appears to call CustomCertificateValidator for every messageWCF ServiceHost 似乎为每条消息调用 CustomCertificateValidator
【发布时间】: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


【解决方案1】:

现在我们更好地理解了服务实例的行为,我们决定接受 BasicHttpBinding 绑定的行为。

我们希望记录远程 SSL 客户端提供的证书的证书过期信息,但是当每条消息都调用验证器时,我们不能轻易做到这一点。真可惜。

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

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

【讨论】:

    猜你喜欢
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2012-08-19
    • 2015-08-22
    相关资源
    最近更新 更多