Обеспечение безопасности клиентов

В Windows Communication Foundation (WCF) служба определяет требования к безопасности для клиентов. Это означает, что служба указывает используемый режим безопасности и определяет, должен ли клиент предоставить учетные данные. Таким образом, процесс обеспечения безопасности клиента прост: используйте метаданные, полученные от службы (если она опубликована), и создайте клиент. Метаданные указывают, как настроить клиент. Если служба требует, чтобы клиент предоставлял учетные данные, необходимо получить учетные данные, удовлетворяющие требованиям. В этом разделе подробно описан данный процесс. Дополнительные сведения о создании безопасной службы см. в разделе "Защита служб".

Служба определяет безопасность

По умолчанию привязки WCF включают функции безопасности. (Исключение — это BasicHttpBinding.) Таким образом, если служба была создана с помощью WCF, существует большая вероятность того, что она реализует меры безопасности, чтобы обеспечить аутентификацию, конфиденциальность и целостность. В таком случае метаданные, предоставляемые службой, будут указывать, что требуется установить безопасный коммуникационный канал. Если метаданные службы не содержат требований по безопасности, не существует способа применить к службе какую-либо схему безопасности, например, SSL через HTTP. Если, однако, служба требует, чтобы клиент предоставлял учетные данные, разработчик, установщик или администратор клиента должны представить фактические учетные данные, которые клиент будет использовать для проверки своей подлинности в службе.

Получение метаданных

При создании клиента первым шагом является получение метаданных от службы, с которой будет взаимодействовать клиент. Это можно сделать двумя способами. Во-первых, если служба публикует конечную точку обмена метаданными (MEX) или делает ее метаданные доступными по протоколу HTTP или HTTPS, можно скачать метаданные с помощью средства служебной программы метаданных ServiceModel (Svcutil.exe),которая создает оба файла кода для клиента, а также файл конфигурации. (Дополнительные сведения об использовании средства см. в разделе Доступ к службам с помощью клиента WCF.) Если служба не публикует конечную точку MEX, а также не делает ее метаданные доступными по протоколу HTTP или HTTPS, обратитесь к создателю службы для документации, которая описывает требования безопасности и метаданные.

Внимание

Рекомендуется получать метаданные из надежного источника, который не был злонамеренно искажен. Метаданные, полученные по протоколу HTTP, передаются открытым текстом и могут быть подделаны. Если в службе используются свойства HttpsGetEnabled и HttpsGetUrl, для загрузки данных по протоколу HTTPS используйте URL-адрес, предоставленный разработчиком службы.

Проверка безопасности

Источники метаданных можно разделить на две большие категории: надежные источники и ненадежные источники. Если вы доверяете источнику и загрузили код клиента и другие метаданные с безопасной конечной точки MEX этого источника, то вы можете создать клиента, снабдить его правильными учетными данными и запустить его без каких-либо других забот.

Однако если клиент и метаданные загружены из источника, о котором мало что известно, обязательно проверьте меры безопасности, используемые в коде. Например, не следует просто создавать клиент, который отправляет ваши личные или финансовые данные в службу, если эта служба не требует как минимум конфиденциальности и целостности. Вы должны доверять владельцу службы в той степени, что вы готовы раскрыть такие сведения, потому что такая информация будет видна для них.

Поэтому, как правило, при использовании кода и метаданных от ненадежного источника проверяйте код и метаданные на предмет соответствия вашим требованиям к безопасности.

Настройка учетных данных клиента

Установка учетных данных клиента состоит из двух этапов.

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

  2. Задайте фактические учетные данные клиента. Фактические учетные данные клиента называются «значением учетных данных клиента», чтобы отличить его от типа. Например, если тип учетных данных клиента представляет собой сертификат, то необходимо предоставить сертификат X.509, выданный службой сертификации, которой доверяет требуемая служба.

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

Если у вас есть файл конфигурации, созданный средством Svcutil.exe, изучите <раздел привязок, чтобы определить, какой тип учетных> данных клиента требуется. В этом разделе находятся связывающие элементы, задающие требования безопасности. В частности, изучите <элемент безопасности> каждой привязки. Этот элемент содержит атрибут 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).

Добавив <раздел поведения> в файл конфигурации для клиента и используя элемент clientCredentials (как показано ниже).

<Задание значения clientCredentials в коде

Чтобы задать <значение clientCredentials> в коде, необходимо получить доступ к ClientCredentials свойству ClientBase<TChannel> класса. Это свойство возвращает объект ClientCredentials, обеспечивающий доступ к различным типам учетных данных, как показано в приведенной ниже таблице.

Свойство ClientCredential Описание Заметки
ClientCertificate Возвращает X509CertificateInitiatorClientCredential Представляет сертификат X.509, предоставляемый клиентом для проверки своей подлинности в службе.
HttpDigest Возвращает HttpDigestClientCredential Представляет учетные данные дайджест-проверки подлинности HTTP. Эти учетные данные представляют собой хэш имени пользователя и пароля.
IssuedToken Возвращает IssuedTokenClientCredential Представляет настраиваемый токен безопасности, выданный службой безопасности токенов, обычно используемый в сценариях федерации.
Peer Возвращает PeerCredential Представляет учетные данные одноранговой сети для участия в одноранговой сети домена Windows.
ServiceCertificate Возвращает X509CertificateRecipientClientCredential Представляет сертификат X.509, предоставляемый службой в рамках внеполосного согласования.
UserName Возвращает UserNamePasswordClientCredential Представляет пару из имени пользователя и пароля.
Windows Возвращает WindowsClientCredential Представляет учетные данные Windows клиента (учетные данные Kerberos). Свойства этого класса доступны только для чтения.

<Установка значения clientCredentials> в конфигурации

Значения учетных данных задаются с помощью элемента поведения конечной точки в качестве дочерних элементов элемента <clientCredentials>. Используемый элемент зависит от типа учетных данных клиента. Например, в следующем примере показано, как настроить сертификат X.509 с помощью <<clientCertificate.>

<configuration>
  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="myEndpointBehavior">
          <clientCredentials>
            <clientCertificate findvalue="myMachineName"
            storeLocation="Current" X509FindType="FindBySubjectName" />
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Чтобы задать учетные данные клиента в конфигурации, добавьте <элемент endpointBehaviors> в файл конфигурации. Кроме того, добавленный элемент поведения должен быть связан с конечной точкой службы с помощью behaviorConfiguration атрибута конечной точки< клиентского ><> элемента, как показано в следующем примере. Значение атрибута behaviorConfiguration должно соответствовать значению атрибута name поведения.

<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="http://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>

См. также