WCF Security 主要包括 "Transfer Security"、"Access Control"、"Auditing" 几个部分。
1. Transfer Security
Transfer Security 主要包括三个方面: "消息完整性(Message Integrity)"、"消息机密性 (Message Confidentiality)" 和 "交互验证(Mutual Authentication)"。
消息完整性必须确保消息在传输过程中没有被篡改,接收的消息是完整且正确的;消息机密性必须确保消息不会被任何第三方查阅,消息内容不会泄漏给任何非相关人员;而交互认证则是指客户端和服务器必须通过某种信任机制才能建立正确的连接,同时交互认证还要监测并阻止拒绝服务攻击(DOS)。通常的做法是对消息进行数字签名来确保其完整性,使用非对称加密算法来阻止消息内容外泄,而用户名/密码、X.509 数字证书等方式则可以用来验证对方身份。
Security Mode
WCF 提供了 5 种不同的安全方式来实现上述三个安全目标。
None: 不采取任何安全措施,仅适合在内部安全环境使用。
Transport: 在传输协议级别上对通道的所有通讯进行加密,可使用的通讯协议包括 HTTPS、TCP、IPC 和 MSMQ。优点是应用广泛,多平台支持,实施方便简单,效率极高,适合高吞吐量的服务使用;缺点是只能实现点对点(point-to-point)的消息安全,在使用中介连接(Proxy)时可能会泄漏消息内容,比较适用于于 Intranet 或直接连接的环境。
Message: 通过相关标准(如 WS-Security)直接对消息进行加密来达到安全目的。优点是能实现端到端(end-to-end)的安全传输,不存在中介安全隐患,且扩展性较好。因采取工业安全标准,所以整合能力更强,适用于 Internet 服务。缺点是比 Transport 效率要低一些。
Mixed(TransportWithMessageCredential): 混合了上面两种方式。使用 Transport 方式完成消息完整性、消息机密性以及服务器认证,而使用 Message 方式完成客户端认证。
Both: 使用 Transport 和 Message 共同完成所有的安全过程,比较恐怖,性能低下,只有 NetMsmqBinding 支持这一安全方式。
Bindings and transfer security modes
附:NetTcpBinding、NetNamedPipeBinding 和 NetMsmqBinding 缺省使用 Transport 安全方式,原因是因为它们多用于 Intranet 环境下,相对比较安全。另外 Transport 方式拥有较好的性能,也非常适合内部高性能服务系统使用。BasicHttpBinding 缺省采取 None 方式是为了兼容 ASMX。
我们可以通过编码或者配置文件的方式来指定 Binding 的安全方式。
NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.Message;
app.config<bindings>
<netTcpBinding>
<binding name = "NewBinding0">
<security mode = "Message" />
</binding>
</netTcpBinding>
</bindings>
Credentials
Security Mode 解决了消息的完整性和机密性,那么剩下来的就是 "Authentication" 了。WCF 支持多种认证方式,允许我们从多个 "客户端验证类型(Client Credentials Types)" 中选择适合我们需求的方案,比如经典的 "用户名/密码",或者 "Windows 集成身份认证(NTLM 或 Kerberos)"、"X.509 数字证书" 等。
2. Access Control
Access Control 又被称之为 "Authorization",和 "Authentication" 验证客户端身份的目的不同,它被用来控制用户(组)的代码访问授权。比如说财务相关服务只能被 "会计部" 访问,人事相关服务只能被 "人事部" 和 "董事会" 访问,越权访问会触发 "权限异常"。有关这部分的内容,可以参考我以前写的文章 —— 《.NET 基于角色安全性验证》。
简单点说,"Authentication" 询问 "你是谁?",然后 "Authorization" 会限制你该做什么,不该做什么。
3. Auditing
Auditing 的作用是将 WCF 安全相关事件记录到 "Windows 系统日志" 中。