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 中消息级安全性的客户端凭据
None - 这里,加密用于保护消息,而不执行客户端身份验证,这意味着匿名客户端可以访问该服务。除 BasicHttpBinding 之外,所有 WCF 绑定都支持此客户端凭据。但应该注意的是,对于 NetNamedPipeBinding,此客户端凭据根本不可用。
Windows - 在这里,消息加密和客户端身份验证都是针对实时登录用户进行的。在这种情况下,与所有其他 WCF 绑定不同,NetNamedPipeBinding 不可用,并且 BasicHttpBinding 不提供支持。
UserName - 在这里,消息通过提供用户名进行加密和保护,并且客户端在需要提供密码时进行身份验证。BasicHttpBinding 就像上面两个客户端凭据一样,不支持 UserName,并且不适用于 NetNamedPipeBinding。
证书- 除了消息加密之外,客户端和服务都通过证书进行身份验证。此客户端凭据可用,并且受除 NetNamedPipeBinding 之外的所有 WCF 绑定支持。
IssuedToken - 由 Cardspace 等权威机构颁发的令牌用于验证消息。消息的加密也在此处执行。
以下代码显示如何在 WCF 消息安全级别/模式中配置客户端凭据。
<netTcpBinding> <binding name = "WCFMessageSecurityExample"> <security mode = "Message"> <message clientCredentialType = "None"/> </security> </binding> </netTcpBinding> <netMsmqBinding>...</netMsmqBinding> </bindings> <behaviors>...</behaviors>
这里必须指出的是,传输安全模式比消息安全级别具有优势,因为前者速度更快。它不需要任何额外的编码并提供互操作性支持,因此不会降低整体性能。
但从安全角度来看,消息安全模式更加健壮,并且与协议无关,提供端到端的安全性。