如何:指定客户端凭据值

通过使用 Windows Communication Foundation (WCF),服务可以指定针对该服务对客户端进行身份验证的方式。 例如,服务可以规定客户端使用证书进行身份验证。

确定客户端凭据类型

  1. 从服务的元数据终结点检索元数据。 通常,元数据包括两个文件:采用所选编程语言(默认情况下为 Visual C#)的客户端代码和一个 XML 配置文件。 检索元数据的方法之一是使用 Svcutil.exe 工具返回客户端代码和客户端配置。 有关详细信息,请参阅检索元数据ServiceModel 元数据实用工具 (Svcutil.exe)

  2. 打开 XML 配置文件。 如果使用的是 Svcutil.exe 工具,则文件的默认名称为 Output.config。

  3. 找到具有 mode 特性的 <security> 元素(<security mode =MessageOrTransport>,其中 MessageOrTransport 设置为一种安全模式)。

  4. 找到与模式值匹配的子元素。 例如,如果模式设置为“Message”,则找到 <security> 元素中所含的 <message> 元素。

  5. 请注意分配给 clientCredentialType 特性的值。 实际值取决于所使用的模式(传输或消息)。

下面的 XML 代码演示了对使用消息安全性并要求使用证书对客户端进行身份验证的客户端的配置。

<security mode="Message">
    <transport clientCredentialType="Windows" proxyCredentialType="None"
        realm="" />
     <message clientCredentialType="Certificate" negotiateServiceCredential="true"
    algorithmSuite="Default" establishSecurityContext="true" />
</security>

示例:TCP 传输模式,使用证书作为客户端凭据

此示例将安全模式设置为“传输”模式,并将客户端凭据值设置为 X.509 证书。 下面的过程演示如何在代码和配置中设置客户端上的客户端凭据值。 这里假定你已使用 ServiceModel 元数据实用工具 (Svcutil.exe) 从服务返回元数据(代码和配置)。 有关详细信息,请参阅如何:创建客户端

在代码中指定客户端上的客户端凭据值

  1. 使用 ServiceModel 元数据实用工具 (Svcutil.exe) 从服务生成代码和配置。

  2. 使用生成的代码创建 WCF 客户端的实例。

  3. 在客户端类上,将 ClientCredentials 类的 ClientBase<TChannel> 属性设置为适当的值。 本示例使用 SetCertificate 类的 X509CertificateInitiatorClientCredential 方法将该属性设置为 X.509 证书。

    // Create a binding using Transport and a certificate.
    NetTcpBinding b = new NetTcpBinding();
    b.Security.Mode = SecurityMode.Transport;
    b.Security.Transport.ClientCredentialType =
        TcpClientCredentialType.Certificate;
    
    // Create an EndPointAddress.
    EndpointAddress ea = new EndpointAddress(
        "net.tcp://localHost:8036/Calculator/MyCalculator");
    
    // Create the client.
    CalculatorClient cc = new CalculatorClient(b, ea);
    
    // Set the certificate for the client.
    cc.ClientCredentials.ClientCertificate.SetCertificate(
        StoreLocation.LocalMachine,
        StoreName.My,
        X509FindType.FindBySubjectName,
        "cohowinery.com");
    try
    {
        cc.Open();
        // Begin using the client.
        Console.WriteLine(cc.Divide(1001, 2));
        cc.Close();
    }
    catch (AddressAccessDeniedException adExc)
    {
        Console.WriteLine(adExc.Message);
        Console.ReadLine();
    }
    catch (System.Exception exc)
    {
        Console.WriteLine(exc.Message);
        Console.ReadLine();
    }
    
    ' Create a binding using Transport and a certificate.
    Dim b As New NetTcpBinding()
    b.Security.Mode = SecurityMode.Transport
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
    
    ' Create an EndPointAddress.
    Dim ea As New EndpointAddress("net.tcp://localHost:8036/Calculator/MyCalculator")
    
    ' Create the client.
    Dim cc As New CalculatorClient(b, ea)
    
    ' Set the certificate for the client.
    cc.ClientCredentials.ClientCertificate.SetCertificate( _
    StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "cohowinery.com")
    Try
        cc.Open()
        ' Begin using the client.
        Console.WriteLine(cc.Divide(1001, 2))
        cc.Close()
    Catch adExc As AddressAccessDeniedException
        Console.WriteLine(adExc.Message)
        Console.ReadLine()
    Catch exc As System.Exception
        Console.WriteLine(exc.Message)
        Console.ReadLine()
    End Try
    

    可以使用 X509FindType 类的任何枚举。 如果该证书发生更改(由于超过到期日期),则在此处使用主题名称。 使用主题名称,基础结构可以再次查找该证书。

在配置中指定客户端上的客户端凭据值

  1. <behavior> 元素添加到 <behaviors> 元素中。

  2. <clientCredentials> 元素添加到 <behaviors> 元素中。 请确保将必需的 name 属性设置为适当的值。

  3. <clientCertificate> 元素添加到 <clientCredentials> 元素中。

  4. 将下列特性设置为适当的值:storeLocationstoreNamex509FindTypefindValue,如下面的代码中所示。 有关证书的详细信息,请参阅使用证书

    <behaviors>
       <endpointBehaviors>
          <behavior name="endpointCredentialBehavior">
            <clientCredentials>
              <clientCertificate findValue="Contoso.com"
                                 storeLocation="LocalMachine"
                                 storeName="TrustedPeople"
                                 x509FindType="FindBySubjectName" />
            </clientCredentials>
          </behavior>
       </endpointBehaviors>
    </behaviors>
    
  5. 在配置客户端时,通过设置 behaviorConfiguration 元素的 <endpoint> 特性来指定该行为,如下面的代码中所示。 终结点元素是 <client> 元素的子元素。 同时还要通过将 bindingConfiguration 特性设置为客户端的绑定来指定绑定配置的名称。 如果使用的是生成的配置文件,则自动生成该绑定的名称。 在本示例中,该名称为 "tcpBindingWithCredential"

    <client>
      <endpoint name =""
                address="net.tcp://contoso.com:8036/aloha"
                binding="netTcpBinding"
                bindingConfiguration="tcpBindingWithCredential"
                behaviorConfiguration="endpointCredentialBehavior" />
    </client>
    

另请参阅