В данном разделе, предназначенном для разработчиков Служба WCF (Windows Communication Foundation), не знакомых с Windows® Identity Foundation (WIF), рассматриваются следующие вопросы:

Включение поддержки WIF в службе WCF

Включить поддержку WIF в существующей службе WCF можно двумя указанными ниже способами.

  1. Вызов в службе метода ConfigureServiceHost или одной из перегруженных версий этого метода. Дополнительные сведения см. в разделе Инструкции: программное включение WIF в службе WCF.

  2. Внесение изменений в файл конфигурации службы. Дополнительные сведения см. в разделе Инструкции: создание приложения проверяющей стороны WCF и Установление отношения доверия между службой проверяющей стороны WCF и STS с помощью FedUtil. В частности, необходимо добавить в список реакций на события службы новую реакцию, как показано в приведенном ниже примере.

      Копировать код
    <behaviors> <serviceBehaviors> <behavior name="ClaimsAwareService1.ServiceBehavior" > <!-- Расширение реакции на событие, добавляющее в службу поддержку утверждений --> <federatedServiceHostConfiguration/> <!-- Во избежание раскрытия метаданных перед развертыванием присвойте следующему параметру значение false и удалите вышеуказанную конечную точку метаданных --> <serviceMetadata httpGetEnabled="true"/> <!-- Чтобы получать сведения об исключениях при сбоях во время отладки, присвойте следующему параметру значение true.  Перед развертыванием замените значение на false, чтобы избежать раскрытия сведений об исключениях --> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors>
    

Если в одном приложении используется несколько служб, можно включить поддержку WIF отдельно для каждой службы.

Платформа WIF совместима по формату подключения, поэтому служба WCF с включенной поддержкой WIF совместима с клиентом WCF 3.5.

Изменения в Windows Identity Foundation для разработчиков служб WCF

Включение поддержки WIF в существующей службе WCF приводит к указанным ниже изменениям.

Модель утверждений

  1. Модель утверждений в WIF заменяет модель утверждений в WCF. Дополнительные сведения см. в разделе Claim.

  2. Аналогично, при включении поддержки WIF в службе WCF свойство Claims объекта ServiceSecurityContext.Current становится недоступным. Для получения сведений о вызывающей стороне следует использовать свойство Thread.CurrentPrincipal. При этом другие свойства объекта ServiceSecurityContext.Current остаются доступными.

  3. OperationContext более не содержит утверждения WCF. Эти утверждения следует получать из свойстваThread.CurrentPrincipal.

Авторизация

  1. Объекты авторизации политики WCF не поддерживаются в WIF. Как правило, разработчик WCF переопределяет метод GetAuthorizationPolicy для преобразования утверждений. В WCF каждое средство проверки подлинности маркеров содержит политики, которые, в свою очередь, содержат наборы утверждений. По умолчанию WCF принимает все эти политики. Преобразование утверждений в WCF заключается в принятии или отклонении этих политик по отдельности. Однако в WIF вместо средств проверки подлинности маркеров используются обработчики маркеров. Обработчики маркеров содержат наборы утверждений, основанные на новой модели утверждений. Преобразование утверждений — а именно их принятие и отклонение — выполняется в классе ClaimsAuthenticationManager. Переопределение метода GetAuthorizationPolicy более не поддерживается, поэтому если ранее в этом методе была задана логика преобразования утверждений, ее следует перенести в настраиваемый класс ClaimsAuthenticationManager.

  2. Политика авторизации WCF более не поддерживается. Как правило, разработчик WCF принимает решения об авторизации в настраиваемом диспетчере авторизации, который подключается к узлу службы, на основе утверждений в свойстве ServiceSecurityContext. Однако в WIF политика авторизации WCF была заменена на класс ClaimsAuthorizationManager. Разработчик должен реализовать методы этого класса и принимать решения об авторизации на основе объекта пользователя IClaimsPrincipal, который можно получить, вызвав свойство Thread.CurrentPrincipal.

    В WIF диспетчер ServiceAuthorizationManager по умолчанию заменен на собственный диспетчер IdentityModelServiceAuthorizationManager с целью интеграции в среду размещения WCF. При настройке диспетчера ServiceAuthorizationManager перед вызовом ConfigureServiceHost внесенные в конфигурацию изменения будут утеряны. Настройку необходимо выполнить после вызова ConfigureServiceHost. При наличии собственной реализации класса ServiceAuthorizationManager ее необходимо изменить, сделав этот класс производным от класса IdentityModelServiceAuthorizationManger. Если в реализации был переопределен метод GetAuthorizationPolicies, необходимо вызвать метод base.GetAuthorizationPolicies.

  3. Многие параметры проверки подлинности WCF в ServiceHost.Credentials не рекомендуется использовать в WIF. Ниже перечислены некоторые параметры, которые более не поддерживаются.

    • ServiceHost.Credentials.IssuedTokenAuthentication

    • ServiceHost.Credentials.ClientCertificate.Authentication

    • ServiceHost.Credentials.UserNameAuthentication

Прочее

  1. В WIF можно указать сертификат сервера в разделе <system.ServiceModel>/<behaviors>/<serviceBehavior>/<behavior>/<serviceCredentials> файла конфигурации службы, как показано в приведенном ниже примере.

      Копировать код
    <serviceCertificate findValue="48BF03FCEDA703DE09E0F1F0CEFED60BB92B3DD8" storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" />
    
    Если указать сертификат сервера и в конфигурации WIF, и в конфигурации WCF, в службе будет использоваться сертификат, указанный в конфигурации WIF. Если указать сертификат только в конфигурации WCF, в службе будет использоваться этот сертификат.

  2. Обработчики маркеров в WIF эквивалентны поставщику, сериализатору, фабрике и средству проверки подлинности маркеров в WCF. Чтобы изменить механизмы создания, сериализации и проверки маркеров, переопределите конкретный обработчик маркеров и поместите его в коллекцию обработчиков маркеров класса ServiceConfiguration.

  3. В WCF универсальные коды ресурсов (URI) аудитории автоматически заполняются на конечных точках ServiceHost. В WIF свойство AllowedAudienceUris необходимо заполнять вручную.

  4. Для проверки подлинности маркеров SAML и X.509 необходимо реализовать класс IssuerNameRegistry. Пример реализации класса IssuerNameRegistry см. в файле Samples\End-to-end\Authentication Assurance\AuthAssuranceRP\App_Code\TrustedIssuerNameRegistry.cs. Также см. раздел Инструкции: создание собственного реестра имен поставщиков.

  5. Многие параметры конфигурации службы WCF не рекомендуется использовать в WIF. Эквиваленты этих параметров находятся в классе ServiceConfiguration. В приведенной ниже таблице перечислены параметры в классе ServiceConfiguration и соответствующие им параметры в WCF.

    Параметр конфигурации службы Эквивалентный параметр в WCF

    ClaimsAuthenticationManager

    IAuthorizationPolicy

    ClaimsAuthorizationManager

    ServiceAuthorizationManager

    ClaimsPrincipalPermissionAttribute

    PrincipalPermissionAttribute

    IssuerNameRegistry

    None

    IssuerTokenResolver

    IssuedTokenAuthentication.KnownCertificates

    SecurityTokenHandlerCollectionManager

    None

    SecurityTokenHandlers

    SecurityTokenManager

    AudienceRestriction

    IssuedTokenAuthentication.AllowedAudienceUris, IssuedTokenAuthentication.AudienceUriMode

    CertificateValidationMode

    X509ClientCertificateAuthentication.CertificateValidationMode, IssuedTokenAuthentication.CertificateValidationMode

    CertificateValidator

    X509ClientCertificateAuthentication.CustomCertificateValidator, IssuedTokenAuthentication.CustomCertificateValidator

    RevocationMode

    X509ClientCertificateAuthentication.RevocationMode, IssuedTokenAuthentication.RevocationMode

    ServiceCertificate

    ServiceCredentials.ServiceCertificate

    ServiceTokenResolver

    None

    Дополнительные сведения см. в разделе Конфигурация.

  6. В WCF ограничение аудитории для маркера SAML принудительно устанавливалось только для маркеров предъявителя. В WIF аудитории проверяются независимо от типа ключа. Это позволяет защитить определенные классы от атак путем переадресации маркеров.

Возможности Windows Identity Foundation для разработчиков служб WCF

  • В WIF добавлено несколько настраиваемых привязок. Эти привязки предназначены для взаимодействия клиентов WCF со службами маркеров безопасности Службы федерации Active Directory® (AD FS) 2.0. Эти привязки также можно использовать в качестве привязок на конечных точках настраиваемых служб STS. В этих привязках отключена поддержка сеансов и согласования, и они не соответствуют стандартным привязкам WCF, поскольку их можно настроить на поддержку подтверждения RSA-маркеров при использовании асимметричных ключей. Дополнительные сведения см. в разделе Общие сведения о встроенных привязках.

  • IClaimsPrinicpal предоставляет доступ к маркеру проверки подлинности. Этот маркер также называется маркером начальной загрузки и является свойством каждого объекта IClaimsPrinicpal. Эта функция по умолчанию отключена; чтобы ее включить, воспользуйтесь свойством SaveBootstrapTokens.

    В приведенном ниже примере показано, как осуществляется доступ к маркерам начальной загрузки в ASP.NET и WCF.

      Копировать код
    // Получение маркера начальной загрузки SecurityToken bootstrapToken = null;
    
    IClaimsPrincipal claimsPrincipal = Thread.CurrentPrincipal as IClaimsPrincipal; if ( claimsPrincipal != null ) { IClaimsIdentity claimsIdentity = (IClaimsIdentity)claimsPrincipal.Identity; bootstrapToken = claimsIdentity.BootstrapToken; }