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

В 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>  

См. также