Как задать значения учетных данных клиента
Используя Windows Communication Foundation (WCF), служба может указать способ проверки подлинности клиента в службе. Например, в службе можно указать, что клиент проходит проверку подлинности с помощью сертификата.
Определение типа учетных данных клиента
Получите метаданные из конечной точки метаданных службы. Метаданные обычно состоят из двух файлов: код клиента на выбранном языке программирования (по умолчанию — Visual C#) и XML-файл конфигурации. Одним из способов получения метаданных является использование программы Svcutil.exe для возвращения кода клиента и конфигурации клиента. Дополнительные сведения см. в разделах Извлечение метаданных и Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe).
Откройте XML-файл конфигурации. Если используется программа Svcutil.exe, то по умолчанию файл имеет имя Output.config.
Найдите элемент <security> с атрибутом mode attribute (<security mode = MessageOrTransport**>**, где в MessageOrTransport установлен один из режимов безопасности.
Найдите дочерний элемент, соответствующий значению режима. Например, если установлен режим Message, найдите элемент <message>, содержащийся в элементе <security>.
Запишите значение, присвоенное атрибуту 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 Metadata Utility Tool (Svcutil.exe) из службы возвращены метаданные (код и конфигурация). Дополнительные сведения см. в разделе Как создать клиент Windows Communication Foundation.
Указание значения учетных данных клиента в коде клиента
С помощью программы Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe) создайте код и конфигурацию из службы.
Создайте экземпляр клиента WCF с помощью созданного кода.
В классе клиента задайте соответствующее значение для свойства ClientCredentials класса ClientBase. В этом примере в качестве значения свойства задается сертификат X.509 с помощью метода SetCertificate класса X509CertificateInitiatorClientCredential.
' 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
// 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(); }
Можно использовать любое перечисление класса X509FindType. В случае, если сертификат изменен (в связи с истечением срока действия) используется имя субъекта. Использование имени субъекта позволяет инфраструктуре снова найти сертификат.
Указание значения учетных данных клиента в конфигурации клиента
Добавьте элемент <behavior> of <endpointBehaviors><behaviors> в элемент .
Добавьте элемент <clientCredentials><behaviors> в элемент. Необходимо присвоить обязательному атрибуту
name
соответствующее значение.Добавьте элемент <clientCertificate> of <serviceCredentials><clientCredentials> в элемент .
Присвойте соответствующие значения следующим атрибутам:
storeLocation
,storeName
,x509FindType
иfindValue
, как показано в следующем коде. Дополнительные сведения сертификатах см. в разделе Работа с сертификатами.<behaviors> <endpointBehaviors> <behavior name="endpointCredentialBehavior"> <clientCredentials> <clientCertificate findValue="Contoso.com" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName" /> </clientCredentials> </behavior> </endpointBehaviors> </behaviors>
При настройке клиента укажите поведение, задав атрибут
behaviorConfiguration
элемента<endpoint>
, как показано в следующем коде. Элемент конечной точки является дочерним объектом элемента <client>. Также укажите имя конфигурации привязки, установив привязку для клиента в атрибутеbindingConfiguration
. Если используется созданный файл конфигурации, имя привязки создается автоматически. В данном примере это имя"tcpBindingWithCredential"
.<client> <endpoint name ="" address="net.tcp://contoso.com:8036/aloha" binding="netTcpBinding" bindingConfiguration="tcpBindingWithCredential" behaviorConfiguration="endpointCredentialBehavior" /> </client>
См. также
Задачи
Как создать клиент Windows Communication Foundation
Справочник
NetTcpBinding
SetCertificate
X509CertificateRecipientServiceCredential
ClientBase
X509CertificateInitiatorClientCredential
Основные понятия
Программирование безопасности WCF
Выбор типа учетных данных
Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe)
Работа с сертификатами
Другие ресурсы
<netTcpBinding>
<security> of <netTcpBinding>
<message> element of <netTcpBinding>
<behavior> of <endpointBehaviors>
<behaviors>
<clientCertificate> of <serviceCredentials>
<clientCredentials>