Практическое руководство. Задание значений учетных данных клиента

С помощью Windows Communication Foundation (WCF) служба может указать, как клиент проходит проверку подлинности в службе. Например, в службе можно указать, что клиент проходит проверку подлинности с помощью сертификата.

Определение типа учетных данных клиента

  1. Получите метаданные из конечной точки метаданных службы. Метаданные обычно состоят из двух файлов: код клиента на выбранном языке программирования (по умолчанию - Visual C#) и XML-файл конфигурации. Одним из способов получения метаданных является использование программы Svcutil.exe для возвращения кода клиента и конфигурации клиента. Дополнительные сведения см. в разделе "Получение метаданных" и средства служебной программы метаданных ServiceModel (Svcutil.exe).

  2. Откройте XML-файл конфигурации. Если используется программа Svcutil.exe, то по умолчанию файл имеет имя Output.config.

  3. Найдите элемент безопасности> с атрибутом режима (<режим безопасности =>MessageOrTransport где MessageOrTransport установлен один из режимов безопасности).<

  4. Найдите дочерний элемент, соответствующий значению режима. Например, если для режима задано значение Message, найдите< элемент сообщения>, содержащийся в элементе< безопасности.>

  5. Обратите внимание, что значение, назначенное атрибуту clientCredentialType . Фактическое значение зависит от используемого режима - транспорт или сообщение.

Следующий XML-код представляет конфигурацию для клиента, использующего безопасность сообщений. Для проверки подлинности клиента требуется сертификат.

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

Пример: транспортный режим TCP с сертификатом в качестве учетных данных клиента

В этом примере в качестве режима безопасности задается Transport, а в качестве значения учетных данных клиента - сертификат X.509. В следующих процедурах показано, как задать значение учетных данных клиента в коде клиента и в конфигурации. Предполагается, что вы использовали средство служебной программы метаданных ServiceModel (Svcutil.exe) для возврата метаданных (кода и конфигурации) из службы. Дополнительные сведения см. в разделе "Практическое руководство. Создание клиента".

Указание значения учетных данных клиента в коде клиента

  1. Используйте средство служебной программы метаданных ServiceModel (Svcutil.exe), чтобы создать код и конфигурацию из службы.

  2. Создайте экземпляр клиента WCF с помощью созданного кода.

  3. В классе клиента задайте соответствующее значение для свойства ClientCredentials класса ClientBase<TChannel>. В этом примере в качестве значения свойства задается сертификат X.509 с помощью метода SetCertificate класса X509CertificateInitiatorClientCredential.

    // 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. Добавьте элемент поведения> в <элемент behaviors>.<

  2. Добавьте элемент clientCredentials> в< элемент behaviors>.< Необходимо присвоить обязательному атрибуту name соответствующее значение.

  3. Добавьте элемент clientCertificate> в< элемент clientCredentials>.<

  4. Присвойте соответствующие значения следующим атрибутам: storeLocation, storeName, x509FindType и findValue, как показано в следующем коде. Дополнительные сведения см. в разделе Работа с сертификатами.

    <behaviors>
       <endpointBehaviors>
          <behavior name="endpointCredentialBehavior">
            <clientCredentials>
              <clientCertificate findValue="Contoso.com"
                                 storeLocation="LocalMachine"
                                 storeName="TrustedPeople"
                                 x509FindType="FindBySubjectName" />
            </clientCredentials>
          </behavior>
       </endpointBehaviors>
    </behaviors>
    
  5. При настройке клиента укажите поведение, задав атрибут behaviorConfiguration элемента <endpoint>, как показано в следующем коде. Элемент конечной точки является дочерним элементом клиентского <> элемента. Также укажите имя конфигурации привязки, установив привязку для клиента в атрибуте bindingConfiguration. Если используется созданный файл конфигурации, имя привязки создается автоматически. В этом примере используется имя "tcpBindingWithCredential".

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

См. также