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 传输,这不被视为安全协议。此处提供端到端的安全性,而无需考虑消息传输中涉及多少中介以及是否存在安全传输。该模式通常由 Internet 应用程序使用。
<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 就像上面的两个客户端凭据一样,不支持 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>
在这里,必须注意传输安全模式比消息安全级别有优势,因为前者更快。它不需要任何额外的编码并提供互操作性支持,因此不会降低整体性能。
但是,从安全的角度来看,消息安全模式更加健壮,独立于协议,提供端到端的安全性。