博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[WCF安全系列]谈谈WCF的客户端认证[X.509证书认证]
阅读量:6705 次
发布时间:2019-06-25

本文共 4043 字,大约阅读时间需要 13 分钟。

前面介绍和这两种典型的客户端认证模式,我们最后来介绍最后一种客户端认证方式,即客户端凭证类型为X.509证书时服务端采用的认证,简称为证书认证。我们照例先看看看客户端证书凭证如何设置设置。

一、客户端证书凭证的设置

在中,我们知道了基于X.509证书证书的服务凭证通过类型表示。与之对应地,客户端凭证对应的类型是。如下面的定义所示,在终结点行为 ClientCredentials中,具有一个只读的ClientCertificate属性,其类型就是X509CertificateInitiatorClientCredential。该类型实际上是对一个类型对象的封装,我们可以通过两个SetCertificate方法重载以证书引用的方式指定某个具体的X.509证书作为客户端的凭证。

1: public class ClientCredentials : SecurityCredentialsManager, IEndpointBehavior
2: {
3:     //其他成员
4:     public X509CertificateInitiatorClientCredential ClientCertificate { get; }
5: }
6: public sealed class X509CertificateInitiatorClientCredential
7: {
8:     //其他成员
9:     public void SetCertificate(string subjectName, StoreLocation storeLocation, StoreName storeName);
10:     public void SetCertificate(StoreLocation storeLocation, StoreName storeName, X509FindType findType, object findValue);
11:     public X509Certificate2 Certificate { get; set; }
12: }

在下面给出服务调用代码中,我们通过编程的方式为ChannelFactory<TChannel>设置了一个基于X.509证书的客户端凭证。

1: using (ChannelFactory
channelFactory = new ChannelFactory
("calculatorService"))
2: {
3:     channelFactory.Credentials.ClientCertificate.SetCertificate(
4:         StoreLocation.LocalMachine,
5:         StoreName.TrustedPeople,
6:         X509FindType.FindBySubjectName,
7:         "‎‎‎Foo");
8:     ICalculator calculator = channelFactory.CreateChannel();
9:     double result = calculator.Add(1, 2);
10:     //...
11: }

终结点行为ClientCredentials同样为客户端(默认)证书的设置定义相应的配置。在下面给出的XML片断中,我们通过配置的方式为终结点凭证指定了一个X.509证书。这个证书将作为服务代理对象(通过ChannelFactory<TChannel>创建的代理,或者是直接实例化通过元数据导入生成的服务代理类型)的默认客户凭证,而该凭证可以通过编程进行动态更改。

1: 
2:   ...
3:   
4:     
5:       
6:         
7:           
8:         
9:       
10:     
11:   
12: 

二、客户端证书认证模式

关于基于证书的客户端认证,你可以与基于证书的服务认证进行类比。对于服务认证,服务在寄宿的时候指定某个X.509证书作为服务的凭证。客户端在默认的情况下会以ChainTrust模式对服务证书进行认证,也可以通过这个终结点行为指定不同的认证模式。对于客户端认证,认证方变成了服务本身,服务端对客户证书的认证也采用相同的策略:默认认证模式为ChainTrust,但借助这个服务行为来指定不同的认证模式。

下面给出了服务端进行客户端证书认证模式设置对应的相关类型的定义。服务行为ServiceCredentials中具有一个只读的ClientCertificate属性,类型为(对应于服务认证中的)。X509CertificateInitiatorServiceCredential定义了只读属性Authentication,其类型为(对应于服务认证中的)。和X509ServiceCertificateAuthentication定义类似,你可以通过X509ClientCertificateAuthentication设置不同的认证模式(None、PeerTrust、ChainTrust、PeerOrChainTrust、Custom)。当你选择Custom模式的时候,你需要通过CustomCertificateValidator属性设置一个自定义的X509CertificateValidator。

1: public class ServiceCredentials : SecurityCredentialsManager, IServiceBehavior
2: {
3:     //其他成员
4:     public X509CertificateInitiatorServiceCredential ClientCertificate { get; }
5: }
6: public sealed class X509CertificateInitiatorServiceCredential
7: {
8:     //其他成员
9:     public X509ClientCertificateAuthentication Authentication { get; }
10:     public X509Certificate2 Certificate { get; set; }
11: }
12: public class X509ClientCertificateAuthentication
13: {
14:     //其他成员
15:     public X509CertificateValidationMode CertificateValidationMode { get; set; }
16:     public X509CertificateValidator CustomCertificateValidator { get; set; }
17: }

下面的代码演示了在对服务进行自我寄宿的情况下,如何设置对客户端证书进行认证的模式,在这里将认证模式设置成了PeerOrChainTrust。

1: using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
2: {
3:     ServiceCredentials serviceCredentials = host.Description.Behaviors.Find
();
4:     if (null == serviceCredentials)
5:     {
6:         serviceCredentials = new ServiceCredentials();
7:         host.Description.Behaviors.Add(serviceCredentials);
8:     }
9:     serviceCredentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
10:     host.Open();
11:     //...
12: }

我们推荐的依旧是采用配置的方式,上面这段代码中设置的服务行为可以通过下面一端配置来表示。

1: 
2: ...
3:   
4:     
5:       
6:         
7:           
8:             
9:           
10:         
11:       
12:     
13:   
14: 
作者:蒋金楠
微信公众账号:大内老A
微博:
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号
蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
你可能感兴趣的文章
使用Spring Session做分布式会话管理
查看>>
mongodb的NUMA问题
查看>>
spring 配置多数据源 (案例)
查看>>
js进阶 12-14 jquery的事件触发函数是哪两个
查看>>
艾伟也谈项目管理,产品版本改造中的项目管理
查看>>
HP官方提供的LR在线基础视频教程
查看>>
yii 隐藏index.php
查看>>
OEA框架学习:使用动软代码生成器
查看>>
【编程范式】汇编解释swap方法
查看>>
[置顶] LLVM每日谈之十五 LLVM自带的examples
查看>>
2013下半年-学习目录
查看>>
网速4M等于多少KB/S,等于多少kbps
查看>>
MySQL MERGE存储引擎 简介
查看>>
asp.net mvc3 数据验证(二)——错误信息的自定义及其本地化
查看>>
用vs2013开发node.js的addon.
查看>>
atitit。自己定义uml MOF EMF体系eclipse emf 教程o7t
查看>>
atitit.taskService 任务管理器的设计 v1
查看>>
编写jquery插件的分享
查看>>
机器学习 —— 概率图模型(学习:对数线性模型)
查看>>
2016百度编程题:蘑菇阵
查看>>