WCF - 安全性



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

关键安全特性

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

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

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

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

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

广告
© . All rights reserved.