Обеспечение безопасности клиентов
В Windows Communication Foundation (WCF) требования безопасности для клиентов определяются службой. Это означает, что служба указывает используемый режим безопасности и определяет, должен ли клиент предоставить учетные данные. Таким образом, процесс обеспечения безопасности клиента прост: используйте метаданные, полученные от службы (если она опубликована), и создайте клиент. Метаданные указывают, как настроить клиент. Если служба требует, чтобы клиент предоставлял учетные данные, необходимо получить учетные данные, удовлетворяющие требованиям. В данном разделе этот процесс рассматривается более подробно. Дополнительные сведения создании безопасной службы см. в разделе Защита служб.
Служба задает безопасность
По умолчанию в привязках WCF включены функции безопасности. (Исключением является класс BasicHttpBinding.) Поэтому если служба была создана с помощью WCF, с большой вероятность она будет реализовывать функции безопасности для обеспечения проверки подлинности, конфиденциальности и целостности. В таком случае метаданные, предоставляемые службой, будут указывать, что требуется установить безопасный коммуникационный канал. Если метаданные службы не содержат требований по безопасности, не существует способа применить к службе какую-либо схему безопасности, например, SSL через HTTP. Если, однако, служба требует, чтобы клиент предоставлял учетные данные, разработчик, установщик или администратор клиента должны представить фактические учетные данные, которые клиент будет использовать для проверки своей подлинности в службе.
Получение метаданных
При создании клиента первым шагом является получение метаданных от службы, с которой будет взаимодействовать клиент. Это можно сделать двумя способами. Во-первых, если служба публикует конечную точку обмена метаданными (MEX) или предоставляет доступ к метаданным по протоколу HTTP или HTTPS, эти метаданные можно загрузить с помощью инструмента Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe), который генерирует файлы кода для клиента и файл конфигурации. (Дополнительные сведения с использованием этого инструмента см. в разделе Обращение к службам с использованием клиента WCF.) Если служба не публикует конечную точку обмена метаданными (MEX) и не предоставляет доступ к метаданным по протоколу HTTP или HTTPS, необходимо обратиться к разработчику службы за документацией, содержащей описание требований к безопасности и метаданные.
![]() |
---|
Рекомендуется получать метаданные из надежного источника, который не был злонамеренно искажен. Метаданные, полученные по протоколу HTTP, передаются открытым текстом и могут быть подделаны. Если в службе используются свойства HttpsGetEnabled и HttpsGetUrl, для загрузки данных по протоколу HTTPS используйте URL-адрес, предоставленный разработчиком службы. |
Проверка безопасности
Источники метаданных можно разделить на две большие категории: надежные источники и ненадежные источники. Если вы доверяете источнику и загрузили код клиента и другие метаданные с безопасной конечной точки MEX этого источника, при создании клиента снабдите его правильными учетными данными — никакие дополнительные меры не требуются.
Однако если клиент и метаданные загружены из источника, о котором мало что известно, обязательно проверьте меры безопасности, используемые в коде. Например, не следует просто создавать клиент, который отправляет ваши личные или финансовые данные в службу, если эта служба не требует как минимум конфиденциальности и целостности. Необходимо доверять владельцу службы в степени, позволяющей раскрывать ему такую информацию, так как она доступна владельцу службы.
Поэтому, как правило, при использовании кода и метаданных от ненадежного источника проверяйте код и метаданные на предмет соответствия вашим требованиям к безопасности.
Задание учетных данных клиента
Задание учетных данных клиента в клиенте состоит из двух этапов.
Определите тип учетных данных клиента, требуемых службой. Это можно сделать одним из двух способов. Во-первых, если у вас есть документация от разработчика службы, в ней должен быть указан тип учетных данных клиента (при наличии), требуемых службой. Во-вторых, при наличии только файла конфигурации, созданного инструментом Svcutil.exe, можно изучить индивидуальные привязки и определить требуемый тип учетных данных.
Задайте фактические учетные данные клиента. Фактические учетные данные клиента называются значением учетных данных клиента, чтобы отличать их от типа учетных данных. Например, если типом учетных данных клиента является сертификат, необходимо предоставить сертификат X.509, выданный службой сертификации, которой доверяет требуемая служба.
Определение типа учетных данных клиента
При наличии файла конфигурации, созданного инструментом Svcutil.exe, изучите раздел <bindings>, чтобы определить требуемый тип учетных данных клиента. В этом разделе находятся элементы привязки, задающие требования безопасности. Конкретно изучите элемент <security> каждой привязки. Этот элемент содержит атрибут mode, которому можно присвоить одно из трех возможных значений (Message, Transport или TransportWithMessageCredential). Значение этого атрибута определяет режим, задающий, в свою очередь, какой из дочерних элементов является значимым.
Элемент <security>
может содержать элемент <transport>
, элемент <message>
или оба этих элемента. Значимым элементом является тот, который соответствует режиму безопасности. Например, следующий код задает режим безопасности "Message"
, а типом учетных данных клиента для элемента <message>
является "Certificate"
. В этом случае элемент <transport>
можно игнорировать. Однако элемент <message>
задает, что должен быть предоставлен сертификат X.509.
<wsHttpBinding>
<binding name="WSHttpBinding_ICalculator">
<security mode="Message">
<transport clientCredentialType="Windows"
realm="" />
<message clientCredentialType="Certificate"
negotiateServiceCredential="true"
algorithmSuite="Default"
establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
Обратите внимание, что если для атрибута clientCredentialType
задано значение "Windows"
, как показано с следующем примере, предоставлять фактическое значение учетных данных не требуется. Это связано с тем, что встроенная система безопасности Windows предоставляет фактические учетные данные (маркер Kerberos) пользователя, запустившего клиент.
<security mode="Message">
<transport clientCredentialType="Windows "
realm="" />
</security>
Задание значения учетных данных клиента
Если установлено, что клиент должен предоставлять учетные данные, используйте подходящий способ настройки клиента. Например, чтобы задать сертификат клиента, используйте метод SetCertificate.
Обычной формой учетных данных является сертификат X.509. Эти учетные данные можно предоставить двумя способами.
- Запрограммировав их в коде клиента (с помощью метода SetCertificate).
Добавив раздел <behaviors> в файл конфигурации клиента и использовав элемент clientCredentials
(показан ниже).
Задание значения <clientCredentials> в коде
Чтобы задать значение <clientCredentials> в коде, необходимо обратиться к свойству ClientCredentials класса ClientBase. Это свойство возвращает объект ClientCredentials, обеспечивающий доступ к различным типам учетных данных, как показано в приведенной ниже таблице.
Свойство ClientCredential | Описание | Примечания |
---|---|---|
Возвращает X509CertificateInitiatorClientCredential |
Представляет сертификат X.509, предоставляемый клиентом для проверки своей подлинности в службе. |
|
Возвращает HttpDigestClientCredential |
Представляет учетные данные дайджест-проверки подлинности HTTP. Эти учетные данные представляют собой хэш имени пользователя и пароля. |
|
Возвращает IssuedTokenClientCredential |
Представляет настраиваемый маркер безопасности, выданный службой маркеров безопасности, обычно используемой в сценариях федерации. |
|
Возвращает PeerCredential |
Представляет одноранговые учетные данные для участия в сетке узлов домена Windows. |
|
Возвращает X509CertificateRecipientClientCredential |
Представляет сертификат X.509, предоставляемый службой для согласования вне полосы. |
|
Возвращает UserNamePasswordClientCredential |
Возвращает пару, содержащую имя пользователя и пароль. |
|
Возвращает WindowsClientCredential |
Представляет учетные данные Windows клиента (учетные данные Kerberos). Свойства этого класса доступны только для чтения. |
Задание значения <clientCredentials> в конфигурации
Значения учетных данных задаются с помощью расширения функциональности конечной точки в виде дочерних элементов элемента <clientCredentials>. Используемый элемент зависит от типа учетных данных клиента. Например, в следующем примере кода показана конфигурация для задания сертификата X.509 с помощью <clientCertificate> of <clientCredentials> Element.
<configuration>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="myEndpointBehavior">
<clientCredentials>
<clientCertificate findvalue="myMachineName"
storeLocation="Current" X509FindType="FindBySubjectName" />
</clientCredentials>
</behavior>
</behaviors>
</system.serviceModel>
</configuration>
Для задания учетных данных клиента в конфигурации добавьте элемент <endpointBehaviors> в файл конфигурации. Кроме того, добавленный элемент расширения функциональности должен быть связан с конечной точкой службы с помощью атрибута behaviorConfiguration
элемента <endpoint>, как показано в приведенном ниже примере. Значение атрибута behaviorConfiguration
должно соответствовать значению атрибута name расширения функциональности.
<configuration>
<system.serviceModel>
<client>
<endpoint address="https://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
behaviorConfiguration="myEndpointBehavior"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</client>
</system.serviceModel>
</configuration>
![]() |
---|
Некоторые из значений учетных данных клиента не могут задаваться с помощью файлов конфигурации приложения; это, например, значения имени пользователя и пароля или значения пользователя и пароля Windows. Такие значения учетных данных могут быть заданы только в коде. |
Дополнительные сведения задании учетных данных клиента см. в разделе Как задать значения учетных данных клиента.
![]() |
---|
Значение ClientCredentialType игнорируется, если для параметра SecurityMode задано значение "TransportWithMessageCredential", как показано в следующем примере конфигурации.
|
<wsHttpBinding>
<binding name="PingBinding">
<security mode="TransportWithMessageCredential" >
<message clientCredentialType="UserName"
establishSecurityContext="false"
negotiateServiceCredential="false" />
<transport clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
См. также
Задачи
Как задать значения учетных данных клиента
Как указывать тип учетных данных клиента
Справочник
ClientCredentials
ClientBase
ClientCredentials
HttpsGetEnabled
HttpsGetUrl
Основные понятия
Средство редактирования конфигурации (SvcConfigEditor.exe)
Защита служб
Обращение к службам с использованием клиента WCF
Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe)