说说WCF通信安全

WCF中每个标准绑定都提供用于控制传输安全性要求的参数。这些参数通常包括指定是使用消息级安全性还是使用传输级安全性的安全模式,还包括客户端凭据类型的选项。基于这些参数提供的可供选择的选项,构建一个具有适当安全性的信道堆栈。
Transfer Security 主要包括三个方面: "消息完整性(Message Integrity)"、"消息机密性 (Message Confidentiality)" 和 "交互验证(Mutual Authentication)"。

•消息完整性必须确保消息在传输过程中没有被篡改,接收的消息是完整且正确的;
•消息机密性必须确保消息不会被任何第三方查阅,消息内容不会泄漏给任何非相关人员;
•交互认证则是指客户端和服务器必须通过某种信任机制才能建立正确的连接,同时交互认证还要监测并阻止拒绝服务攻击(DOS)。通常的做法是对消息进行数字签名来确保其完整性,使用非对称加密算法来阻止消息内容外泄,而用户名/密码、X.509 数字证书等方式则可以用来验证对方身份。

WCF 安全编程基于三个步骤是 选择安全模式、选择客户端凭据类型和设置凭据值

1,选择安全模式

WCF通信安全性分为消息级别、传输级别两个部分认证,Security Mode可以选择使用的传输级安全性和消息级安全性的类型,此属性解决的问题是在那里层(部分)进行安全认证。
WCF 提供了 5 种不同的安全方式来实现上述三个安全目标。
•None: 不采取任何安全措施,仅适合在内部安全环境使用。
•Transport: 在传输协议级别上对通道的所有通讯进行加密,可使用的通讯协议包括 HTTPS、TCP、IPC 和 MSMQ。优点是应用广泛,多平台支持,实施方便简单,效率极高,适合高吞吐量的服务使用;缺点是只能实现点对点(point-to-point)的消息安全,在使用中介连接(Proxy)时可能会泄漏消息内容,比较适用于于 Intranet 或直接连接的环境。
•Message: 通过相关标准(如 WS-Security)直接对消息进行加密来达到安全目的。优点是能实现端到端(end-to-end)的安全传输,不存在中介安全隐患,且扩展性较好。因采取工业安全标准,所以整合能力更强,适用于 Internet 服务。缺点是比 Transport 效率要低一些。
•TransportWithMessageCredential: 使用 Transport 方式完成消息完整性、消息机密性以及服务器认证,而使用 Message 方式完成客户端认证。
•Both: 使用 Transport 和 Message 共同完成所有的安全过程,性能低下,只有 NetMsmqBinding 支持这一安全方式。

附:NetTcpBinding、NetNamedPipeBinding 和 NetMsmqBinding 缺省使用 Transport 安全方式,原因是因为它们多用于 Intranet 环境下,相对比较安全。另外 Transport 方式拥有较好的性能,也非常适合内部高性能服务系统使用。BasicHttpBinding 缺省采取 None 方式是为了兼容 ASMX。

我们可以通过编码或者配置文件的方式来指定 Binding 的安全方式。

NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode 
= SecurityMode.Message;

 app.config

<bindings>
  
<netTcpBinding>
    
<binding name = "NewBinding0">
      
<security mode = "Message" />
    
</binding>
  
</netTcpBinding>
</bindings>

 

2,选择客户端凭据类型,凭据是WCF用于创建已声明的标识或功能的数据。客户端必须提供该凭据才能与您的服务进行通信。此属性解决的问题是怎样进行安全认证。

传输凭据类型
下表列出了在传输安全模式下可以由绑定使用的客户端凭据的可能类型。创建服务时,将 ClientCredentialType 属性设置为这些值之一以指定凭据类型,客户端必须提供该凭据才能与您的服务进行通信。可以在代码或配置文件中设置这些类型。

•None 指定客户端不需要提供任何凭据。这相当于匿名客户端。
•Basic 为客户端指定基本身份验证。
•Digest 为客户端指定摘要式身份验证。
•Ntlm 指定 NT LAN Manager (NTLM) 身份验证。在由于某种原因无法使用 Kerberos 身份验证时使用。还可以通过将 AllowNtlm 属性设置为 false 来禁止将 NTLM 用作回退身份验证,这将使 WCF 在使用 NTLM 时尽可能引发异常。请注意,将此属性设置为 false 可能不阻止通过网络发送 NTLM 凭据。
•Windows 指定 Windows 身份验证。若要在 Windows 域上仅指定 Kerberos 协议,则将 AllowNtlm 属性设置为 false(默认值为 true)。
•Certificate 使用 X.509 证书执行客户端身份验证。
•UserName 用户必须提供用户名和密码。使用 Windows 身份验证或其他自定义解决方案验证用户名/密码对。

 

消息客户端凭据类型
下表列出了在创建使用消息安全的应用程序时可以使用的可能的凭据类型。可以在代码或配置文件中使用这些值。 
•None 指定客户端不需要提供凭据。这相当于匿名客户端。
•Windows 允许在使用 Windows 凭据建立的安全上下文中交换 SOAP 消息。
•UserName 允许服务可以要求使用用户名凭据对客户端进行身份验证。请注意,WCF 不允许使用用户名进行任何加密操作,例如生成签名或加密数据。WCF 可确保在使用用户名凭据时传输会受到保护。
•Certificate 允许服务可以要求使用 X.509 证书对客户端进行身份验证。
•IssuedToken 根据安全策略配置的自定义令牌类型。默认令牌类型为安全断言标记语言 (SAML)。令牌由安全令牌服务颁发。有关更多信息,请参见 联合令牌与颁发的令牌.

我们可以通过编码或者配置文件的方式来指定 Binding 的安全方式。

下面配置结果是相同的,在级别使用证书的方式认证

 

NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode 
= SecurityMode.Message;
binding.Security.Message.ClientCredentialType
= MessageCredentialType.Certificate

 

app.config 

<bindings>
  
<netTcpBinding>
    
<binding name = "NewBinding0">
      
<security mode = "Message">
       
<message clientCredentialType="Certificate" />
      
</security>
    
</binding>
  
</netTcpBinding>
</bindings>

 

 

3,设置服务凭据值
   一旦选择了客户端凭据类型,就必须设置可供服务和客户端使用的实际凭据,用来暗示了服务凭据类型、选择的安全模式和客户端凭据类型 用来向服务器进行安全模式的身份证明 ,此属性解决的问题是使用那些数据进行认证。
   如果“选择客户端凭据类型”为“Certificate” 那必须在这里关联一个证书,并指定证书的验证方式。
   设置凭据值包含设置服务凭据值和设置客户端凭据值

<behaviors>
  
<serviceBehaviors >
    
<behavior name="NewBinding0_Behavior" >
      
<serviceCredentials>
        
<!--指定一个 X.509 证书,以供服务用来向使用 Message 安全模式的客户端证明自己的身份-->
        
<serviceCertificate findValue="CN=ejiyuan" storeLocation="LocalMachine" storeName="My"/>
    
</behavior>
  
</serviceBehaviors>
</behaviors>

 

 

综合上述几段代码,在消息级别进行加密,使用X.509 证书进行验证,证书信息为findValue="CN=ejiyuan" storeLocation="LocalMachine" storeName="My"

 参考 :常用安全方案 http://msdn.microsoft.com/zh-cn/library/ms730301(v=VS.100).aspx

posted @ 2010-05-31 14:59  ejiyuan  阅读(7587)  评论(1编辑  收藏  举报