传输安全概述

Windows Communication Foundation (WCF) 中的传输安全性机制取决于使用的绑定和传输。 例如,当使用 WSHttpBinding 类时,传输为 HTTP,保证传输安全的主要机制为 HTTP 上的安全套接字层 (SSL) (通常称为 HTTPS)。 本主题讨论 WCF 系统提供的绑定中使用的主要传输安全性机制。

注意

将 SSL 安全与 .NET Framework 3.5 及更高版本一起使用时,WCF 客户端将同时使用其证书存储区中的中间证书和 SSL 协商期间收到的中间证书,对服务的证书执行证书链验证。 .NET Framework 3.0 仅使用本地证书存储区中安装的中间证书。

警告

在使用传输安全时,可能会覆盖 Thread.CurrentPrincipal 属性。 若要阻止此情况发生,请将 ServiceAuthorizationBehavior.PrincipalPermissionMode 设置为 PrincipalPermissionMode.NoneServiceAuthorizationBehavior 是可对服务说明设置的服务行为。

BasicHttpBinding

默认情况下,BasicHttpBinding 类不提供安全性。 此绑定旨在提供与不实现安全机制的 Web 服务提供程序的互操作性。 但可以通过将 Mode 属性设置为 None 以外的值来启用安全。 若要启用传输安全,请将该属性设置为 Transport

与 IIS 的互操作

BasicHttpBinding 类主要用于与现有的 Web 服务和由 Internet 信息服务 (IIS) 承载的许多服务进行互操作。 因此,此绑定的传输安全旨在实现与 IIS 站点的无缝互操作。 通过将安全模式设置为 Transport,然后设置客户端凭据类型可以实现这一目的。 凭据类型值对应于 IIS 目录安全机制。 下面的代码演示如何设置模式以及如何将凭据类型设置为 Windows。 当客户端和服务器在同一个 Windows 域中时,您可以使用此配置。

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

或在配置中:

<bindings>  
  <basicHttpBinding>  
    <binding name="SecurityByTransport">  
      <security mode="Transport">  
        <transport clientCredentialType="Windows" />  
       </security>  
     </binding>  
  </basicHttpBinding>  
</bindings>  

以下几节讨论其他客户端凭据类型。

基本

这对应于 IIS 中的基本身份验证方法。 使用此模式时,必须为 IIS 服务器配置 Windows 用户帐户和适当的 NTFS 文件系统权限。 有关 IIS 6.0 的信息,请参阅启用基本身份验证和配置领域名称。 有关 IIS 7.0 的详细信息,请参阅配置基本身份验证 (IIS 7)

证书

IIS 有一个要求客户端使用证书进行登录的选项。 此功能还可以使 IIS 将客户端证书映射到 Windows 帐户。 有关 IIS 6.0 详细信息,请参阅在 IIS 6.0 中启用客户端证书。 有关在 IIS 7.0 的详细信息,请参阅在 IIS 7 中配置服务器证书

摘要

摘要式身份验证类似于基本身份验证,但其具有以哈希形式而不是明文形式发送凭据的优点。 有关 IIS 6.0 的详细信息,请参阅 IIS 6.0 中的摘要式身份验证。 有关 IIS 7.0 的详细信息,请参阅配置摘要式身份验证 (IIS 7)

Windows

这对应于 IIS 中的集成 Windows 身份验证。 设置为此值时,还需要服务器位于使用 Kerberos 协议作为其域控制器的 Windows 域中。 如果服务器不在支持 Kerberos 的域中,或者如果 Kerberos 系统失败,您可以使用下一节中说明的 NT LAN Manager (NTLM) 值。 有关 IIS 6.0 的详细信息,请参阅 IIS 6.0 中的 Integrated Windows Authentication。 有关在 IIS 7.0 的详细信息,请参阅在 IIS 7 中配置服务器证书

NTLM

这使服务器可以在 Kerberos 协议失败时使用 NTLM 进行身份验证。 有关在 IIS 6.0 中配置 IIS 的信息,请参阅强制执行 NTLM 身份验证。 对于 IIS 7.0,Windows 身份验证包括 NTLM 身份验证。 有关详细信息,请参阅 在 IIS 7 中配置服务器证书

WsHttpBinding

WSHttpBinding 类专用于与实现 WS* 规范的服务进行互操作。 此绑定的传输安全为 HTTP 上的安全套接字层 (SSL),即 HTTPS。 若要创建使用 SSL 的 WCF 应用程序,请使用 IIS 托管该应用程序。 或者,如果您要创建自承载的应用程序,请使用 HttpCfg.exe 工具将 X.509 证书绑定到计算机上的特定端口。 端口号作为 WCF 应用程序的一部分以终结点地址的形式进行指定。 使用传输模式时,终结点地址必须包括 HTTPS 协议,否则运行时将引发异常。 有关详细信息,请参阅 HTTP 传输安全性

对于客户端身份验证,请将 ClientCredentialType 类的 HttpTransportSecurity 属性设置为 HttpClientCredentialType 枚举值之一。 枚举值与 BasicHttpBinding 的客户端凭据类型等同,并由 IIS 服务承载。

下面的示例演示与 Windows 的客户端凭据类型一起使用的绑定。

// The code uses a shortcut to specify the security mode to Transport.
WSHttpBinding b = new WSHttpBinding(SecurityMode.Transport);
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
' The code uses a shortcut to specify the security mode to Transport.
Dim b As WSHttpBinding = New WSHttpBinding(SecurityMode.Transport)
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows

WSDualHttpBinding

此绑定只提供消息级别的安全,不提供传输级别的安全。

NetTcpBinding

NetTcpBinding 类使用 TCP 进行消息传输。 通过实现 TCP 上的传输层安全性 (TLS) 为传输模式提供安全。 由操作系统提供 TLS 实现。

也可以通过将 ClientCredentialType 类的 TcpTransportSecurity 属性设置为 TcpClientCredentialType 值之一来指定客户端的凭据类型,如下面的代码所示。

NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType =
TcpClientCredentialType.Certificate;
Dim b As NetTcpBinding = New NetTcpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate

客户端

在客户端,必须使用 SetCertificate 类的 X509CertificateInitiatorClientCredential 方法指定证书。

注意

如果您要使用 Windows 安全性,则不需要证书。

下面的代码使用唯一标识证书的证书指纹。 有关证书的详细信息,请参阅使用证书

NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
EndpointAddress a = new EndpointAddress("net.tcp://contoso.com/TcpAddress");
ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(b, a);
cf.Credentials.ClientCertificate.SetCertificate(
    StoreLocation.LocalMachine,
    StoreName.My,
    X509FindType.FindByThumbprint,
    "0000000000000000000000000000000000000000");
Dim b As NetTcpBinding = New NetTcpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
Dim a As New EndpointAddress("net.tcp://contoso.com/TcpAddress")
Dim cf As ChannelFactory(Of ICalculator) = New ChannelFactory(Of ICalculator)(b, a)
cf.Credentials.ClientCertificate.SetCertificate( _
    StoreLocation.LocalMachine, _
    StoreName.My, _
    X509FindType.FindByThumbprint, _
    "0000000000000000000000000000000000000000")

或者,在客户端配置中的 behaviors 节中使用 <clientCredentials> 元素指定证书。

<behaviors>  
  <behavior>  
   <clientCredentials>  
     <clientCertificate findValue= "101010101010101010101010101010000000000"
      storeLocation="LocalMachine" storeName="My"
      X509FindType="FindByThumbPrint">  
     </clientCertificate>  
   </clientCredentials>  
 </behavior>  
</behaviors>

NetNamedPipeBinding

NetNamedPipeBinding 类用于进行有效的计算机内通信;也就是说,虽然可以在同一网络上的两台计算机之间创建命名管道通道,但进程是在同一台计算机上运行的。 此绑定只提供传输级别的安全。 在创建使用此绑定的应用程序时,终结点地址必须包括“net.pipe”作为终结点地址的协议。

WSFederationHttpBinding

使用传输安全时,此绑定与已颁发的令牌 (TransportWithMessageCredential) 一起使用 HTTP 上的 SSL(称为 HTTPS)。 有关联合身份验证的详细信息,请参阅联合身份验证和颁发的令牌

NetPeerTcpBinding

NetPeerTcpBinding 类是旨在使用对等网络功能进行有效通信的一种安全传输。 TCP 是协议,这与类和绑定的名称相一致。 当安全模式设置为“传输”时,绑定将实现 TCP 上的 TLS。 有关对等功能的详细信息,请参阅对等网络连接

MsmqIntegrationBinding 和 NetMsmqBinding

有关消息队列(以前称为 MSMQ)的传输安全的完整讨论,请参见使用传输安全性保护消息

另请参阅