В данном разделе, предназначенном для разработчиков Служба WCF (Windows Communication Foundation), не знакомых с Windows® Identity Foundation (WIF), рассматриваются следующие вопросы:
- Какие возможности WCF более не поддерживаются
в WIF?
- Какие новые возможности появились в WIF?
Включение поддержки WIF в службе WCF
Включить поддержку WIF в существующей службе WCF можно двумя указанными ниже способами.
- Вызов в службе метода ConfigureServiceHost или одной из
перегруженных версий этого метода. Дополнительные сведения см. в
разделе Инструкции: программное
включение WIF в службе WCF.
- Внесение изменений в файл конфигурации службы. Дополнительные
сведения см. в разделе Инструкции: создание
приложения проверяющей стороны 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 приводит к указанным ниже изменениям.
Модель утверждений
- Модель утверждений в WIF заменяет модель утверждений в WCF.
Дополнительные сведения см. в разделе Claim.
- Аналогично, при включении поддержки WIF в службе WCF свойство
Claims объекта
ServiceSecurityContext.Current
становится недоступным. Для получения сведений о вызывающей стороне следует использовать свойство Thread.CurrentPrincipal. При этом другие свойства объектаServiceSecurityContext.Current
остаются доступными.
- OperationContext более не содержит утверждения WCF. Эти
утверждения следует получать из
свойстваThread.CurrentPrincipal.
Авторизация
- Объекты авторизации политики WCF не поддерживаются в WIF. Как
правило, разработчик WCF переопределяет метод
GetAuthorizationPolicy для преобразования утверждений. В WCF
каждое средство проверки подлинности маркеров содержит политики,
которые, в свою очередь, содержат наборы утверждений. По умолчанию
WCF принимает все эти политики. Преобразование утверждений в WCF
заключается в принятии или отклонении этих политик по отдельности.
Однако в WIF вместо средств проверки подлинности маркеров
используются обработчики маркеров. Обработчики маркеров содержат
наборы утверждений, основанные на новой модели утверждений.
Преобразование утверждений — а именно их принятие и отклонение —
выполняется в классе ClaimsAuthenticationManager.
Переопределение метода GetAuthorizationPolicy более не
поддерживается, поэтому если ранее в этом методе была задана логика
преобразования утверждений, ее следует перенести в настраиваемый
класс ClaimsAuthenticationManager.
- Политика авторизации WCF более не поддерживается. Как правило,
разработчик WCF принимает решения об авторизации в настраиваемом
диспетчере авторизации, который подключается к узлу службы, на
основе утверждений в свойстве ServiceSecurityContext. Однако
в WIF политика авторизации WCF была заменена на класс ClaimsAuthorizationManager.
Разработчик должен реализовать методы этого класса и принимать
решения об авторизации на основе объекта пользователя IClaimsPrincipal,
который можно получить, вызвав свойство
Thread.CurrentPrincipal.
В WIF диспетчерServiceAuthorizationManager
по умолчанию заменен на собственный диспетчер IdentityModelServiceAuthorizationManager с целью интеграции в среду размещения WCF. При настройке диспетчераServiceAuthorizationManager
перед вызовомConfigureServiceHost
внесенные в конфигурацию изменения будут утеряны. Настройку необходимо выполнить после вызоваConfigureServiceHost
. При наличии собственной реализации классаServiceAuthorizationManager
ее необходимо изменить, сделав этот класс производным от классаIdentityModelServiceAuthorizationManger
. Если в реализации был переопределен методGetAuthorizationPolicies
, необходимо вызвать методbase.GetAuthorizationPolicies
.
- Многие параметры проверки подлинности WCF в
ServiceHost.Credentials не рекомендуется использовать в WIF.
Ниже перечислены некоторые параметры, которые более не
поддерживаются.
-
ServiceHost.Credentials.IssuedTokenAuthentication
-
ServiceHost.Credentials.ClientCertificate.Authentication
-
ServiceHost.Credentials.UserNameAuthentication
-
Прочее
- В WIF можно указать сертификат сервера в разделе
<system.ServiceModel>/<behaviors>/<serviceBehavior>/<behavior>/<serviceCredentials>
файла конфигурации службы, как показано в приведенном ниже примере.
Копировать код <serviceCertificate findValue="48BF03FCEDA703DE09E0F1F0CEFED60BB92B3DD8" storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" />
- Обработчики маркеров в WIF эквивалентны поставщику,
сериализатору, фабрике и средству проверки подлинности маркеров в
WCF. Чтобы изменить механизмы создания, сериализации и проверки
маркеров, переопределите конкретный обработчик маркеров и поместите
его в коллекцию обработчиков маркеров класса ServiceConfiguration.
- В WCF универсальные коды ресурсов (URI) аудитории автоматически
заполняются на конечных точках
ServiceHost
. В WIF свойство AllowedAudienceUris необходимо заполнять вручную.
- Для проверки подлинности маркеров SAML и X.509 необходимо
реализовать класс IssuerNameRegistry.
Пример реализации класса IssuerNameRegistry
см. в файле Samples\End-to-end\Authentication
Assurance\AuthAssuranceRP\App_Code\TrustedIssuerNameRegistry.cs.
Также см. раздел Инструкции: создание
собственного реестра имен поставщиков.
- Многие параметры конфигурации службы WCF не рекомендуется
использовать в WIF. Эквиваленты этих параметров находятся в классе
ServiceConfiguration.
В приведенной ниже таблице перечислены параметры в классе ServiceConfiguration
и соответствующие им параметры в WCF.
Параметр конфигурации службы Эквивалентный параметр в WCF IAuthorizationPolicy
ServiceAuthorizationManager
PrincipalPermissionAttribute
None
IssuedTokenAuthentication.KnownCertificates
None
SecurityTokenManager
IssuedTokenAuthentication.AllowedAudienceUris, IssuedTokenAuthentication.AudienceUriMode
X509ClientCertificateAuthentication.CertificateValidationMode, IssuedTokenAuthentication.CertificateValidationMode
X509ClientCertificateAuthentication.CustomCertificateValidator, IssuedTokenAuthentication.CustomCertificateValidator
X509ClientCertificateAuthentication.RevocationMode, IssuedTokenAuthentication.RevocationMode
ServiceCredentials.ServiceCertificate
None
- В 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; }