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传输,这不被视为安全协议.在这里,安全性是端到端提供的,而不考虑在消息传输中涉及多少中介,以及是否存在安全传输.该模式通常由互联网应用程序使用.

<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不提供其支持.

  • UserName &minus ;在这里,通过提供UserName来加密和保护消息,并且客户端在需要提供密码时进行身份验证. BasicHttpBinding就像上面两个客户端凭证一样,不支持UserName,也不适用于NetNamedPipeBinding.

  • 证书 : 与消息加密一起,客户端和服务都获得证书认证.此客户端凭证可用,并且除NetNamedPipeBinding之外的所有WCF绑定都支持.

  • IssuedToken : 来自诸如Cardspace之类的权限的颁发令牌用于验证消息.此处还会执行消息加密.

以下代码显示如何在WCF消息安全级别/模式中配置客户端凭据./p>

<netTcpBinding>
   <binding name = "WCFMessageSecurityExample">
      <security mode = "Message">
         <message clientCredentialType = "None"/>
      </security>   
   </binding>
</netTcpBinding>

<netMsmqBinding>...</netMsmqBinding>
</bindings>
<behaviors>...</behaviors>

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

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