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