您可以使用WCF配置更改BehaviorExtension吗?

时间:2018-10-05 23:46:35

标签: c# .net wcf servicebehavior

我的网站调用了一项服务(简称为FooService),该服务需要一组非常复杂的身份验证协议。协议全部包装在一个自定义ClientCredentials行为中,该行为在代码中声明如下:

class FooServiceCredentialsBehavior : ClientCredentials 
{
    public FooServiceCredentialsBehavior()
    {
        //Set up service certificate
        var cert = CertStore.FindBySerialNumber(certSerialNumber);
        base.ServiceCertificate.DefaultCertificate = cert;
    }
}

然后我们注册行为扩展:

  <behaviorExtensions>
    <add name="FooServiceCredentials" type="MyProject.Namespace.FooService, MyProject" />
  </behaviorExtensions>

配置一个端点行为以使用它:

<endpointBehaviors>
    <behavior name="FooServiceCredentialsBehavior">
      <FooServiceCredentials />
    </behavior>

并设置端点以使用它:

<endpoint address="https://fooservice.com/bar"
          behaviorConfiguration="FooServiceCredentialsBehavior"
          contract="FooService_PortType" />

以上所有功能都非常完美,并且已经有很多客户使用了多年。

我现在正在将此内容部署到无法访问CRL服务器的系统,并且自定义行为包括已启用验证的服务证书。因此,我需要关闭验证。但是 我无法修改FooServiceCredentials类 。如果可以的话,我会这样做:

base.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

但是我不能。

我想知道是否可以添加适用于将执行相同操作的自定义凭据行为的WCF配置。像这样:

<endpointBehaviors>
    <behavior name="FooServiceCredentialsBehavior">
      <FooService>
          <ServiceCertificate>
              <authentication certificateValidationMode="None"/>
          </ServiceCertificate>
      </FooService>
    </behavior>

这种确切的XML不起作用(该服务甚至无法启动),但我希望有某种魔术方法来安排这些标签,以仅从配置中禁用服务证书验证。

有可能吗?怎么样?

1 个答案:

答案 0 :(得分:1)

官方文件说有可能做到这一点。检查以下链接:authentication of serviceCertificate Element

我认为对于behaviorExtension配置,由于您继承自ClientCredentials,因此以下配置应该可以使用:

<behavior name="FooServiceCredentialsBehavior">
  <FooServiceCredentials>
      <serviceCertificate>
        <authentication certificateValidationMode="None" revocationMode="NoCheck" />
      </serviceCertificate>
  </FooServiceCredentials>
</behavior>

如果这不起作用,则可以使用另一个选项,而不使用behaviorExtension并直接在clientCredentials配置中指定类,如下所示:

<behavior name="FooServiceCredentialsBehavior">
  <clientCredentials type="FooNamespace.FooServiceCredentialsBehavior, FooAssemblyName">
      <serviceCertificate>
        <authentication certificateValidationMode="None" revocationMode="NoCheck" />
      </serviceCertificate>
  </clientCredentials>
</behavior>