如何:设置安全模式

Windows Communication Foundation (WCF) 安全性在大多数预定义的绑定上有三个常见的安全模式:传输、消息和“带有消息凭据的传输”。两个附加模式特定于两个绑定:在 BasicHttpBinding 上找到的“仅传输凭据”模式以及在 NetMsmqBinding 上找到的“两个”模式。 不过,本主题主要讨论三种常见安全模式:TransportMessageTransportWithMessageCredential

请注意,并非所有预定义绑定都支持所有这些模式。 本主题使用 WSHttpBindingNetTcpBinding 类来设置模式,并演示如何以编程方式来设置安全模式,如何通过配置来设置安全模式。

有关详细信息,请参阅 WCF 安全性的安全性概述保证服务的安全保护服务和客户端的安全。 有关传输模式和消息的详细信息,请参阅传输安全性消息安全性

在代码中设置安全模式

  1. 创建要使用的绑定类的一个实例。 有关预定义的绑定的列表,请参阅系统提供的绑定。 此示例创建 WSHttpBinding 类的一个实例。

  2. 设置 Mode 属性所返回的对象的 Security 属性。

    WSHttpBinding b = new WSHttpBinding();
    b.Security.Mode = SecurityMode.Transport;
    
    Dim b As New WSHttpBinding()
    b.Security.Mode = SecurityMode.Transport
    

    或者,设置为消息模式,如下面的代码所示。

    WSHttpBinding b = new WSHttpBinding();
    b.Security.Mode = SecurityMode.Message;
    
    Dim b As New WSHttpBinding()
    b.Security.Mode = SecurityMode.Message
    

    或者,设置为使用消息凭据的传输模式,如下面的代码所示。

    WSHttpBinding b = new WSHttpBinding();
    b.Security.Mode = SecurityMode.TransportWithMessageCredential;
    
    Dim b As New WSHttpBinding()
    b.Security.Mode = SecurityMode.TransportWithMessageCredential
    
  3. 此外,还可以在绑定的构造函数中设置模式,如下面的代码所示。

    WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);
    
    Dim b As New WSHttpBinding(SecurityMode.Message)
    

设置 ClientCredentialType 属性

将模式设置为三个值之一,就确定了 ClientCredentialType 属性的设置方式。 例如,使用 WSHttpBinding 类将模式设置为 Transport,意味着必须将 ClientCredentialType 类的 HttpTransportSecurity 属性设置为相应的值。

针对传输模式设置 ClientCredentialType 属性

  1. 创建绑定的一个实例。

  2. Mode 属性设置为 Transport

  3. ClientCredential 属性设置为适当的值。 下面的代码将该属性设置为 Windows

    WSHttpBinding b = new WSHttpBinding();
    b.Security.Mode = SecurityMode.Transport;
    b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
    
    Dim b As New WSHttpBinding()
    b.Security.Mode = SecurityMode.Transport
    b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows
    

针对消息模式设置 ClientCredentialType 属性

  1. 创建绑定的一个实例。

  2. Mode 属性设置为 Message

  3. ClientCredential 属性设置为适当的值。 下面的代码将该属性设置为 Certificate

    WSHttpBinding b = new WSHttpBinding();
    b.Security.Mode = SecurityMode.Message;
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    
    Dim b As New WSHttpBinding()
    b.Security.Mode = SecurityMode.Message
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    

在配置中设置 Mode 和 ClientCredentialType 属性

  1. 向配置文件的 <bindings> 元素添加一个适当的绑定元素。 下面的示例添加一个 <wsHttpBinding> 元素。

  2. 添加一个 <binding> 元素,并将它的 name 特性设置为适当的值。

  3. 添加一个 <security> 元素,并将 mode 属性设置为 MessageTransportTransportWithMessageCredential

  4. 如果模式设置为 Transport,则添加一个 <transport> 元素,并将 clientCredential 属性设置为适当的值。

    下面的示例将模式设置为 "Transport",并将 clientCredentialType 元素的 <transport> 属性设置为 "Windows"

    <wsHttpBinding>
    <binding name="TransportSecurity">
        <security mode="Transport" >
           <transport clientCredentialType = "Windows" />
        </security>
    </binding>
    </wsHttpBinding >
    

    或者,将 security mode 设置为 "Message",后接一个 <"message"> 元素。 本示例将 clientCredentialType 设置为 "Certificate"

    <wsHttpBinding>
    <binding name="MessageSecurity">
        <security mode="Message" >
           <message clientCredentialType = "Certificate" />
        </security>
    </binding>
    </wsHttpBinding >
    

    使用 TransportWithMessageCredential 值是一种特殊情况,下面将进行说明。

使用 TransportWithMessageCredential

在将安全模式设置为 TransportWithMessageCredential 时,传输会确定实际提供传输级安全的机制。 例如,HTTP 协议使用基于 HTTP 的安全套接字层 (SSL)(SSL over HTPP,或 HTTPS)。 因此,对任何传输安全对象(例如 ClientCredentialType)的 HttpTransportSecurity 属性进行的设置都将被忽略。 换言之,只能设置消息安全对象(对于 ClientCredentialType 绑定,则是 WSHttpBinding 对象)的 NonDualMessageSecurityOverHttp

有关详细信息,请参阅如何:使用传输安全性和消息凭据

请参阅