- WCF 教程
- WCF - 首页
- WCF - 概述
- WCF - 与Web服务的比较
- WCF - 开发工具
- WCF - 架构
- WCF - 创建WCF服务
- WCF - 托管WCF服务
- WCS - IIS托管
- WCF - 自托管
- WCF - WAS托管
- WCF - Windows服务托管
- WCF - 使用WCF服务
- WCF - 服务绑定
- WCF - 实例管理
- WCF - 事务
- WCF - RIA服务
- WCF - 安全性
- WCF - 异常处理
- WCF 资源
- WCF - 快速指南
- WCF - 有用资源
- WCF - 讨论
WCF - 安全性
WCF服务拥有强大的安全系统,具有两种安全模式或级别,确保只有预期的客户端才能访问服务。WCF在很大程度上缓解了分布式事务中常见的安全威胁。
关键安全特性
WCF服务具有四个关键安全特性,如下图所示。
身份验证 - 此处,身份验证不仅限于识别消息发送者,而且是相互的,即需要对消息接收者进行身份验证,以排除任何中间人攻击的可能性。
授权 - 这是WCF服务为确保安全而采取的下一步,在此确定服务是否应授权调用者继续执行操作。尽管授权不依赖于身份验证,但它通常在身份验证之后进行。
机密性 - 调用者和服务之间的信息交换保密,以限制未打算接收消息的其他人对其进行解释。为实现这一点,使用了加密以及各种其他机制。
完整性 - 最终的关键概念是保持完整性,即确保消息在从发送方到接收方的传输过程中未被任何人篡改。
传输安全模式
WCF提供以下传输安全模式,以确保客户端和服务器之间安全的通信。各种传输安全模式如下所示。
无 - 此模式不保证任何类型的消息安全,并且服务不会获得有关客户端的任何凭据。此模式风险极高,因为它可能允许消息篡改,因此不推荐使用。
<wsHttpBinding>
<binding name = "WCFSecurityExample">
<security mode = "None"/>
</binding>
</wsHttpBinding>
传输 - 此模式是通过使用TCP、IPC、Https和MSMQ等通信协议实现安全消息传输的最简单方法。此模式在点对点传输时更有效,主要用于受控环境,即内联网应用程序。
<wsHttpBinding>
<binding name = "WCFSecurityExample">
<security mode = "Transport"/>
</binding>
</wsHttpBinding>
消息 - 安全模式允许相互身份验证,并在很大程度上提供隐私,因为消息被加密并且可以通过http传输,而http不被认为是安全的协议。此处提供的安全是端到端的,而不考虑消息传输中涉及多少中间体以及是否存在安全的传输。此模式通常由互联网应用程序使用。
<wsHttpBinding>
<binding name = "WCFSecurityExample">
<security mode = "Message"/>
</binding>
</wsHttpBinding>
混合 - 此安全模式不经常使用,并且客户端身份验证仅在客户端级别提供。
<wsHttpBinding>
<binding name = "WCFSecurityExample">
<security mode = "TransportWithMessageCredential"/>
</binding>
</wsHttpBinding>
两者 - 此安全模式包括传输安全和消息安全,以提供强大的安全保护,但通常会导致整体性能过载。只有MSMQ支持此模式。
<netMsmqBinding>
<binding name = "WCFSecurityExample">
<security mode = "Both"/>
</binding>
</netMsmqBinding>
除BasicHttpBinding之外的所有WCF绑定默认都具有一定程度的传输安全。
消息安全级别
消息级安全不依赖于WCF协议。它通过使用标准算法加密数据来与消息数据本身一起使用。对于消息安全级别,有多种客户端凭据可用于不同的绑定,这些将在下面讨论。
WCF中消息级安全的客户端凭据
无 - 在这里,使用加密来保护消息,而无需执行客户端身份验证,这意味着匿名客户端可以访问服务。除BasicHttpBinding之外,所有WCF绑定都支持此客户端凭据。但是需要注意的是,对于NetNamedPipeBinding,此客户端凭据完全不可用。
Windows - 在这里,对于实时登录的用户,消息加密和客户端身份验证都会发生。在这种情况下,与所有其他WCF绑定不同,NetNamedPipeBinding不可用,并且BasicHttpBinding也不支持。
用户名 - 在这里,消息被加密并通过提供用户名来保护,并且客户端经过身份验证,因为他们需要提供密码。与上述两种客户端凭据一样,BasicHttpBinding不支持用户名,并且对于NetNamedPipeBinding不可用。
证书 - 除了消息加密之外,客户端和服务都通过证书进行身份验证。此客户端凭据可用,并且除NetNamedPipeBinding之外,所有WCF绑定都支持它。
颁发令牌 - 使用来自Cardspace等授权机构的颁发令牌来验证消息。此处还会执行消息加密。
以下代码显示如何在WCF消息安全级别/模式中配置客户端凭据。
<netTcpBinding>
<binding name = "WCFMessageSecurityExample">
<security mode = "Message">
<message clientCredentialType = "None"/>
</security>
</binding>
</netTcpBinding>
<netMsmqBinding>...</netMsmqBinding>
</bindings>
<behaviors>...</behaviors>
这里必须注意的是,传输安全模式优于消息安全级别,因为前者更快。它不需要任何额外的编码并提供互操作性支持,因此不会降低整体性能。
但是,从安全角度来看,消息安全模式更强大,独立于协议,并提供端到端安全。