Wcf 自定义证书验证不验证

Wcf custom certificate validation doesn't validate

我试图找出我的 wcf 配置中的错误,但找不到问题出在哪里。可能我需要更多的眼睛;无论如何我想在 wcf 中使用自定义认证验证。我在我的 CertificateValidator class 中设置了断点,但是这个断点没有捕获到任何请求,但是应用程序是 运行,我可以发送请求(没有证书)。

这是我的配置

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding maxReceivedMessageSize="104857600">
        <security>
          <message clientCredentialType="Certificate" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings>

  <services>
    <service name="AccountService" behaviorConfiguration="">
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="" contract="IAccountService"></endpoint> 
    </service>
    <service name="PortalService" behaviorConfiguration="">
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="" contract="IPortalService"></endpoint>
    </service>
  </services>

  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="false"/>
        <serviceCredentials>
          <clientCertificate>
            <authentication certificateValidationMode="Custom" customCertificateValidatorType="Services.Validators.CertificateValidator, Services" />
          </clientCertificate>
        </serviceCredentials>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
  </protocolMapping>    
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>

您使用的是 NET 4 还是 4.5?

我认为你错过的事情:

  • 您的自定义 basicHttpBinding 需要使用 <security mode="Message">(目前您没有指定它,这意味着默认为 "None"
  • 您的自定义 basicHttpBinding 需要一个 name= 以便可以引用
  • 您的端点需要使用 bindingConfiguration=
  • 来引用自定义 basicHttpBinding
  • 您的自定义服务行为需要一个name=以便被引用
  • 您的服务需要使用 behaviorConfiguration=
  • 来引用自定义服务行为
  • 您的服务需要在 <serviceCredentials> 中指定一个 <serviceCertificate>,用于在协议中与客户端建立安全通道
  • 您的客户端需要知道 <clientCredentials> 中的 '<serviceCertificate>' 以便它可以与服务器建立安全通道
  • 您的客户端需要将用于凭据的证书附加到发送到服务器的请求(通过在 .config 中的 <clientCredentials> 中指定 <clientCertificate>,或者以编程方式)
  • 确保您已正确创建和安装证书

注意:您应该至少创建了 2 个证书 - 1 用于服务器的标识 - 1 个或多个客户端用于凭据(取决于您是否决定所有客户端都应出示相同的证书,或者您是否为每个客户端分配唯一的证书) - 不要对服务器身份和客户端凭据使用相同的证书

一些有助于理解的链接"message level security":

如果您的消息交换对您来说太慢,请考虑使用 "Transport" 级别的安全性。

试试这个:

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="securebasicHttpBinding" maxReceivedMessageSize="104857600">
          <security mode="Message">
            <message clientCredentialType="Certificate" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>

    <services>
      <service behaviorConfiguration="secureBehaviour" name="AccountService">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="securebasicHttpBinding"
          contract="IAccountService" />
      </service>
      <service behaviorConfiguration="secureBehaviour" name="PortalService">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="securebasicHttpBinding"
          contract="IPortalService" />
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="secureBehaviour">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <serviceCredentials>
            <serviceCertificate ...something goes here... />
            <clientCertificate>
              <authentication certificateValidationMode="Custom" customCertificateValidatorType="Services.Validators.CertificateValidator, Services" />
            </clientCertificate>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>