如何:创建使用自定义证书验证程序的服务
本主题介绍如何实现自定义证书验证程序,以及如何配置客户端或服务凭据以使用自定义证书验证程序替换默认证书验证逻辑。
如果使用 X.509 证书对客户端或服务进行身份验证,则默认情况下,Windows Communication Foundation (WCF) 使用 Windows 证书存储区和加密 API 来验证该证书并确保它是受信任的。有时,内置证书验证功能还不够且必须更改。WCF 提供了一种简单方式,即通过允许用户添加自定义证书验证程序来更改验证逻辑。如果指定了自定义证书验证程序,则 WCF 不使用内置证书验证逻辑,而是依靠自定义验证程序。
过程
创建自定义证书验证程序
定义一个从 X509CertificateValidator 派生的新类。
实现抽象 Validate 方法。将必须验证的证书作为参数传递给该方法。如果根据验证逻辑,传递的证书无效,则此方法引发 SecurityTokenValidationException。如果证书有效,则此方法返回到调用方。
提示
若要将身份验证错误返回到客户端,应在 Validate 方法中引发 FaultException。
指定服务配置中的自定义证书验证程序
向 <system.ServiceModel> 元素添加一个 <behaviors> 元素和一个 serviceBehaviors section。
添加一个 Behavior element并将 name 属性设置为适当的值。
向 <behavior> 元素中添加一个 <serviceCredentials> Element。
向 <serviceCredentials> 元素中添加一个 <clientCertificate> 元素。
向 <clientCertificate> 元素添加一个 <authentication> of <clientCertificate> Element。
将 customCertificateValidatorType 属性设置为验证程序类型。下面的示例将该属性设置为类型的命名空间和名称。
将 certificateValidationMode 属性设置为 Custom。
<configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="ServiceBehavior"> <serviceCredentials> <clientCertificate> <authentication certificateValidationMode="Custom" customCertificateValidatorType="Samples.MyValidator, service" /> </clientCertificate> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
使用客户端上的配置指定自定义证书验证程序
向 <system.ServiceModel> 元素添加一个 <behaviors> 元素和一个 serviceBehaviors section。
添加一个 <endpointBehaviors> 元素。
添加一个 <behavior> 元素,并将 name 属性设置为适当的值。
添加一个 <clientCredentials> 元素。
添加一个 <authentication> of <serviceCertificate> Element,如下面的示例所示。
将 customCertificateValidatorType 属性设置为验证程序类型。
将 certificateValidationMode 属性设置为 Custom。下面的示例将该属性设置为类型的命名空间和名称。
<configuration> <system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="clientBehavior"> <clientCredentials> <serviceCertificate> <authentication certificateValidationMode="Custom" customCertificateValidatorType= "Samples.CustomX509CertificateValidator, client"/> </serviceCertificate> </clientCredentials> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel> </configuration>
使用服务上的代码指定自定义证书验证程序
指定 ClientCertificate 属性的自定义证书验证程序。您可以使用 Credentials 属性访问服务凭据。
将 CertificateValidationMode 属性设置为 Custom。
使用客户端上的代码指定自定义证书验证程序
使用 CustomCertificateValidator 属性指定自定义证书验证程序。您可以使用 Credentials 属性访问客户端凭据。(由 ServiceModel Metadata Utility Tool (Svcutil.exe) 生成的客户端类始终是从 ClientBase 类派生而来的。)
将 CertificateValidationMode 属性设置为 Custom。
示例
说明
下面的示例演示自定义证书验证程序的实现及其在服务上的用法。