WCF - 安全性

WCF 服务拥有强大的安全系统,该系统具有两种安全模式或级别,因此只有目标客户端才能访问服务。分布式事务中常见的安全威胁在很大程度上由 WCF 缓解。

关键安全功能

WCF 服务具有四个关键安全功能,如下图所示。

Wcf Security
  • 身份验证 − 在这里,身份验证不仅限于识别消息的发送者,而且是相互的,即需要对消息接收者进行身份验证,以排除任何类型的中间人攻击的可能性。

  • 授权 −这是 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>

这里必须指出的是,传输安全模式比消息安全级别有优势,因为前者速度更快。它不需要任何额外的编码,并提供互操作性支持,因此不会降低整体性能。

但是,从安全角度来看,消息安全模式更强大,独立于协议,并提供端到端安全性。