学WCF也有一段时间了,我买的是<WCF编程>第二版,这本书还是不错的,知识点很全面,不过就是具体的实例很少,这样对于很多的知识点难免会产生"当时看的时候是理解了,但是过一段时间就会忘记"的现象,而且很多的知识会混淆.写这个系列主要是为了复习一下以前学过的知识,把知识做一个系统的整理,便于记忆,再就是对书中的一些内容写出具体的实例,这样记忆会更深刻,我是初学者,肯定会有理解不对的地方,欢迎各位指正.本文中部分内容引用别人的文章,我会在引用的地方标注出来
身份验证:一个特定的动作,在该动作中将检验服务的调用者是否符合自己所声称的身份.身份验证是一个相互的过程,服务端验证客户端,反过来,在某些情况下(通过互联网访问),客户端也需要验证服务端.
身份验证包括:
1. 无身份验证: 所有的调用者都能访问服务
2.Windows身份验证:Kerberos(有域服务器)和NTLM(工作组)
3.用户名与密码: 客户端向服务端发送一个用户名和密码,服务端通过一些凭证库来验证
4.X509证书: 客户端包含一个证书,服务端预先知道这些证书,当客户端发送请求时,服务端会验证客户端的证书
5.定制机制: 允许开发者任意使用一种身份验证机制
6.发布口令: 调用者与服务同事依赖一个安全口令
授权:允许服务调用者能够执行的内容,这个操作是建立在身份验证基础之上的,如果没有身份验证,那么授权也就无从谈起了.服务端会依赖某个凭证库,在那里调用者会被映射为逻辑角色
WCF凭证库:1.Windows组 2.asp.net Provider 3.自定义角色库(最简单)
传输安全:个人理解就是如果保证信息在传输过程中的安全.传输安全是身份验证和授权的前提.
传输安全模式 如图(其实这个图不是从老徐博客里弄得,不过后来才看到右下角有老徐的名字__囧)
书上讲的为5种模式,但是在VS中的配置文件里,却只有四种,不知道为什么???!~~~
TransportWithMessageCredential 对应的是Mixed
None: 关闭了传输安全的功能
Transport Security: 对通道上所有的通信加密,除了接收者外,没有任何一方可以看见消息的内容,这种安全模式只能保证点对点的传输安全,也就是客户端必须与服务端直接连接,
这种模式是最简单的,也是性能最好的.通常只用于局域网应用程序
个人理解:在此模式下,对通道上的所有通信加密,也就是对通信的内容也加密,对内容加密的话,这有点像MessageSecurity模式了,但是Transport的这种内容的加密只能维持在点对点的环境下面,例如有三个点A、B、C,A和B启用了Transport模式
因为Transport要求客户端与服务端就加密进行协商的,在超出点对点的外围以后,消息就不在受保护了,所以在一个复杂的网络环境中,Transport是不可取
Message Security: 只是对消息的本身进行加密而不是对传输进行加密,所以能实现端对端的安全传输
点对点与端对端还是比较容易区分的,如上图,A与C之间是端到端的关系,A与B之间是点到点的关系
Mixed: 在实现完整性和机密性以及服务端身份验证时采用的是Transport Security模式,而在保护客户端安全凭证的安全时采用了Message Security模式,此模式也是一个点对点的模式
个人理解:其实就是在是对传输加密的,但是客户端的凭证(用户名,密码)这些信息是被加密的.
Both: 同是使用Transport模式和Message模式,就是传输时安全的,传输的消息也是经过加密的
以上为5中传输模式,不过对于Transport,我一直有一个疑问就是:Transport为传输的内容加密吗?
通过请教群里的朋友,他们告诉我是对内容加密的,不过还是在这里提出来,希望有更形象的回答.谢谢啦~~~
传输安全模式是在绑定中配置的
<bindings> <netTcpBinding> <binding name="tcpBinding"> <security mode="Transport"> <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/> </security> </binding> </netTcpBinding> </bindings>
编程方式实现:
NetTcpBinding binding = new NetTcpBinding(SecurityMode.Transport);
或者
NetTcpBinding binding1 = new NetTcpBinding(); binding1.Security.Mode = SecurityMode.Transport;
传输安全模式与各种binding是一个组合的关系,并不是每种binding都能应用所有的传输安全模式
所有WCF的绑定默认都是安全的,只有BasicHttpBinding默认是非安全的
名称 |
None |
Transport |
Message |
Mixed |
Both |
BasicHttpBinding |
Yes(默认) |
Yes |
Yes |
Yes |
No |
NetTcpBinding |
Yes |
Yes(默认) |
Yes |
Yes |
No |
NetNamedPipeBinding |
Yes |
Yes(默认) |
No |
No |
No |
WSHttpBinding |
Yes |
Yes |
Yes(默认) |
Yes |
No |
WSDualHttpBinding |
Yes |
No |
Yes(默认) |
No |
No |
NetMsmqBinding |
Yes |
Yes(默认) |
Yes |
No |
Yes |
Mixed和Both不太常用,可以不用记
1.局域网的绑定都默认使用Transport模式
2.所有互联网的绑定(除BasicHttpBinding外,默认为None)都默认使用Message模式
3.WSDualHttpBinding不支持Transport模式
下面看一下,在传输模式下(Transport、Message),身份验证与binding的关系
在Transport模式下:
名称 |
None |
Windows |
UserName |
Certificate |
BasicHttpBinding |
Yes(默认) |
Yes |
Yes |
Yes |
NetTcpBinding |
Yes |
Yes(默认) |
No |
Yes |
NetNamedPipeBinding |
No |
Yes(默认) |
No |
No |
WSHttpBinding |
Yes |
Yes(默认) |
Yes |
Yes |
WSDualHttpBinding |
||||
NetMsmqBinding |
Yes |
Yes(默认) |
No |
Yes |
所有的局域网绑定都支持Windows方式的身份验证
NetTcpBinding在Transport模式下不支持UserName身份验证模式
wsDualHttpBinding不支持Transport传输安全模式的
在Message传输安全模式下Binding与身份验证:
名称 |
None |
Windows |
UserName |
Certificate |
IssuedToken |
BasicHttpBinding |
No |
No |
No |
Yes |
No |
NetTcpBinding |
Yes |
Yes(默认) |
Yes |
Yes |
Yes |
NetNamedPipeBinding |
|||||
WSHttpBinding |
Yes |
Yes(默认) |
Yes |
Yes |
Yes |
WSDualHttpBinding |
Yes |
Yes(默认) |
Yes |
Yes |
Yes |
NetMsmqBinding |
Yes |
Yes(默认) |
Yes |
Yes |
Yes |
除了BasicHttpBinding和NetNamedPipeBinding以外,其他的模式默认都是用Windows凭证
Http协议上是用Windows验证,比较诡异.
书上的说法是:是为了在选定正确的传输安全下,让用户安全的使用WCF直接提供的各种绑定,而不是首先求助于定制凭证库.