[WCF安全系列]绑定、安全模式与客户端凭证类型:WSHttpBinding与WSDualHttpBinding
在上一篇文章中,我们详细地介绍了BasicHttpBinding具有怎样的安全模式的支持,已经在各种安全模式下分别可以采用怎样的客户端凭证。接下来我们来进一步分析另外三个基于HTTP的绑定,即WSHttpBinding、WS2007HttpBinding和WSDualHttpBinding。考虑到它们之间在安全设置方面的相关性,在这里我们先来介绍WSDualHttpBinding。
一、WSDualHttpBinding
我们在前面提到过,WCF所有基于HTTP的绑定的Transport安全模式都是通过TLS/SSL(HTTPS)的方式来实现的。TLS/SSL如果要确保从A到B的安全连接,要求B是一个绑定了数字证书的HTTPS站点。正是由于这样的原因,Transport安全模式不能应用于基于HTTP的双向通信,因为服务端对客户端的安全连接得不到保障。所以WSDualHttpBinding只能提供基于Message安全模式的支持。
这样的限制直接反映应用编程接口的定义上。我们通过WSDualHttpSecurity进行针对于WSDualHttpBinding的安全设置。WSDualHttpSecurity通过Mode属性返回采用的安全模式。该属性类型为WSDualHttpSecurityMode枚举,定义其中的2两个枚举值表示WSDualHttpBinding支持的安全模式:None和Message。这也印证了关于WSDualHttpBinding不能够提供针对Transport安全的论点。在默认的情况下,WSDualHttpBinding采用Message安全模式。
正是因为WSDualHttpBinding只提供针对于Message安全模式的支持,所以WSDualHttpSecurity中仅仅定义了Message属性,而不存在Transport属性的定义。用于进行Message安全设置的Message属性返回的是一个MessageSecurityOverHttp类型对象。MessageSecurityOverHttp具有我们熟悉的ClientCredentialType返回客户端凭证类型,属性对应的类型为MessageCredentialType枚举。定义在MessageCredentialType中的五个枚举值表示支持的五种客户端凭证类型:None、Windows、UserName、Certificate和IssuedToken。 其中Windows为默认的选项,意味着在默认情况下WSDualHttpBinding以Windows认证的方式实现对客户端的认证。WSDualHttpBinding安全相关的应用编程接口的定义体现在如下所示的代码片断中。
1: public sealed class WSDualHttpSecurity
2: {
3: //其他成员
4: public MessageSecurityOverHttp Message { get; set; }
5: public WSDualHttpSecurityMode Mode {get; set; }
6: }
7: public class MessageSecurityOverHttp
8: {
9: //其他成员
10: public MessageCredentialType ClientCredentialType { get; set; }
11: }
12: public enum MessageCredentialType
13: {
14: None,
15: Windows,
16: UserName,
17: Certificate,
18: IssuedToken
19: }
20: public enum WSDualHttpSecurityMode
21: {
22: None,
23: Message
24: }
注:IssuedToken,代表的是一种基于WCS(Windows Card Space)的认证方式,而这又涉及到一个更加宽泛的话题,即安全联合(Security Federation),本系列并不涉及到此内容。
二、WSHttpBinding/WS2007HttpBinding
接下来我们再来讨论一下WSHttpBinding和WS2007HttpBinding。WSHttpBinding的Security属性返回的是一个WSHttpSecurity类型的对象。由于WS2007HttpBinding派生自WSHttpBinding,所以它直接将该属性继承下来。WSHttpSecurity的Mode属性返回一个SecurityMode枚举。定义在该枚举中的四个枚举值表示WSHttpBinding和WS2007HttpBinding支持的4种安全模式:None、Transport、Message和TransportWithMessageCredential,其中Message为默认采用的安全模式。
和BasicHttpBinding一样,WSHttpBinding也具有一个Security属性,不过对应的类型为WSHttpSecurity。WS2007HttpBinding派生自WSHttpBindingWSHttpSecurity,直接继承了Security属性。WSHttpSecurity的Mode属性表示所支持的安全模式,类型为SecurityMode枚举。SecurityMode的四个枚举值表示WSHttpBinding支持的四种安全模式,即None、Transport、Message和TransportWithMessageCredential。其中Message为默认值,意味着WSHttpBinding和WS2007HttpBinding在默认的情况下提供基于Message安全模式的支持。
WSHttpSecurity的Transport属性返回一个HttpTransportSecurity类型的对象,用于进行Transport安全的相关设置。HttpTransportSecurity的ClientCredentialType属性返回的是上面我们提到过的HttpClientCredentialType枚举。这意味着WSHttpBinding和WS2007HttpBinding和BasicHttpBinding在Transport模式下具有相同的客户端凭证类型集。所不同的是,WSHttpBinding和WS2007HttpBinding默认情况下采用Windows凭证。
而WSHttpSecurity的Message属性返回用于进行Message安全相关设置的NonDualMessageSecurityOverHttp类型是MessageSecurityOverHttp的子类,所以它直接继承了定义在MessageSecurityOverHttp中的ClientCredentialType属性。这意味着本节介绍的三种绑定在Message或者Mixed安全模式下具有相同的客户端凭证类型集,并且默认采用Windows凭证。WSHttpBinding和WS2007HttpBinding安全相关的应用编程接口的定义反映在如下的代码片断中。
1: public class WSHttpBinding : WSHttpBindingBase
2: {
3: //其他成员
4: public WSHttpSecurity Security { get; set; }
5: }
6: public class WS2007HttpBinding:WSHttpBinding
7: {
8: //省略成员
9: }
10: public sealed class WSHttpSecurity
11: {
12: //其他成员
13: public SecurityMode Mode { get; set; }
14: public HttpTransportSecurity Transport { get; set; }
15: public NonDualMessageSecurityOverHttp Message {get; set; }
16: }
17: public enum SecurityMode
18: {
19: None,
20: Transport,
21: Message,
22: TransportWithMessageCredential
23: }
24: public sealed class HttpTransportSecurity
25: {
26: //其他成员
27: public HttpClientCredentialType ClientCredentialType { get; set; }
28: }
29: public sealed class NonDualMessageSecurityOverHttp : MessageSecurityOverHttp
30: {
31: //省略成员
32: }
WSHttpBinding、WS2007HttpBinding和WSDualHttpBinding采用和BasicHttpBinding一样的编程方式和配置结构,所以在这里就对在对此进行重复介绍了。
- memory_target设置不当导致数据库无法启动的问题(r3笔记第38天)
- python利用结巴分词做新闻地图
- 数据库静默安装总结(r3笔记第58天)
- 用TensorFlow实现文本分析模型,做个聊天机器人
- 深度学习:用tensorflow建立线性回归模型
- 用python基于2015-2016年的NBA常规赛及季后赛的统计数据分析
- 数值信息的机器级存储
- ABAP和Java里关于DEFAULT(默认)机制的一些语言特性
- Golang语言社区--golang 进度下载文件
- Golang语言社区--Go语言基础第七节函数调用等
- Hyperledger也能实现Token代币
- 经典Java面试题收集(二)
- 关于表联结方法(一)(r3笔记第57天)
- Go 语言读写 Excel 文档
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法