Практическое руководство. Задание значений учетных данных клиента
С помощью Windows Communication Foundation (WCF) служба может указать, как клиент проходит проверку подлинности в службе. Например, в службе можно указать, что клиент проходит проверку подлинности с помощью сертификата.
Определение типа учетных данных клиента
Получите метаданные из конечной точки метаданных службы. Метаданные обычно состоят из двух файлов: код клиента на выбранном языке программирования (по умолчанию - Visual C#) и XML-файл конфигурации. Одним из способов получения метаданных является использование программы Svcutil.exe для возвращения кода клиента и конфигурации клиента. Дополнительные сведения см. в разделе "Получение метаданных" и средства служебной программы метаданных ServiceModel (Svcutil.exe).
Откройте XML-файл конфигурации. Если используется программа Svcutil.exe, то по умолчанию файл имеет имя Output.config.
Найдите элемент безопасности> с атрибутом режима (<режим безопасности =>
MessageOrTransport
гдеMessageOrTransport
установлен один из режимов безопасности).<Найдите дочерний элемент, соответствующий значению режима. Например, если для режима задано значение Message, найдите< элемент сообщения>, содержащийся в элементе< безопасности.>
Обратите внимание, что значение, назначенное атрибуту 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) для возврата метаданных (кода и конфигурации) из службы. Дополнительные сведения см. в разделе "Практическое руководство. Создание клиента".
Указание значения учетных данных клиента в коде клиента
Используйте средство служебной программы метаданных ServiceModel (Svcutil.exe), чтобы создать код и конфигурацию из службы.
Создайте экземпляр клиента WCF с помощью созданного кода.
В классе клиента задайте соответствующее значение для свойства 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. В случае, если сертификат изменен (в связи с истечением срока действия) используется имя субъекта. Использование имени субъекта позволяет инфраструктуре снова найти сертификат.
Указание значения учетных данных клиента в конфигурации клиента
Добавьте элемент поведения> в <элемент behaviors>.<
Добавьте элемент clientCredentials> в< элемент behaviors>.< Необходимо присвоить обязательному атрибуту
name
соответствующее значение.Добавьте элемент clientCertificate> в< элемент 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>
, как показано в следующем коде. Элемент конечной точки является дочерним элементом клиентского <> элемента. Также укажите имя конфигурации привязки, установив привязку для клиента в атрибутеbindingConfiguration
. Если используется созданный файл конфигурации, имя привязки создается автоматически. В этом примере используется имя"tcpBindingWithCredential"
.<client> <endpoint name ="" address="net.tcp://contoso.com:8036/aloha" binding="netTcpBinding" bindingConfiguration="tcpBindingWithCredential" behaviorConfiguration="endpointCredentialBehavior" /> </client>
См. также
- NetTcpBinding
- SetCertificate
- X509CertificateRecipientServiceCredential
- ClientBase<TChannel>
- X509CertificateInitiatorClientCredential
- Программирование безопасности WCF
- Выбор типа учетных данных
- Служебная программа для метаданных ServiceModel (Svcutil.exe)
- Работа с сертификатами
- Практическое руководство. Создание клиента
- <Nettcpbinding>
- <Безопасность >
- <message>
- <Поведение>
- <Поведения>
- <clientCertificate>
- <clientCredentials>