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

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

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

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

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

  3. <Найдите элемент безопасности> с атрибутом mode (<режим безопасности =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 с сертификатом в качестве учетных данных клиента

В этом примере для режима безопасности задан режим транспорта и задано значение учетных данных клиента для сертификата 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. Добавьте элемент <поведения> в элемент <поведения>.

  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>
    

См. также