Если вы уже знакомы с Служба WCF (Windows Communication Foundation), значит, вам также известно, что клиент WCF уже включает возможности федерации. Путем настройки клиента WCF с привязкой WSFederationHttpBinding или аналогичной пользовательской привязкой можно включить федеративную проверку подлинности для службы.

WCF получает маркер, скрытно выданный службой STS, и использует его в целях проверки подлинности для службы. Единственным ограничением при таком подходе является отсутствие возможности отслеживать взаимодействие клиента с сервером. WCF автоматически создает маркер безопасности запроса для службы STS на основе параметров выданного маркера в привязке. Это означает, что клиент не может изменять параметры маркера безопасности запроса для каждого запроса, проверять ответ маркера безопасности запроса для получения таких сведений, как отображаемые утверждения, или кэшировать маркер для последующего использования.

В настоящее время клиент WCF способен выполнять основные сценарии федерации. Тем не менее, один из основных сценариев, поддерживаемых Windows® Identity Foundation (WIF), подразумевает осуществление контроля над маркером безопасности запроса на том уровне, на котором WCF не позволяет этого делать. По этой причине в WIF добавлены функции, обеспечивающие более тщательный контроль над взаимодействием со службой STS.

WIF поддерживает следующие сценарии федерации:

  1. Использование клиента WCF без зависимостей WIF в целях проверки подлинности для федеративной службы

  2. Включение WIF в клиенте WCF для вставки элемента ActAs или OnBehalfOf в маркер безопасности запроса для службы STS

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

Название первого сценария говорит само за себя: существующие клиенты WCF будут продолжать работать с проверяющими сторонами WIF и службами маркеров безопасности. В данном же разделе рассматриваются два других сценария.

Расширение возможностей существующего клиента WCF за счет элементов ActAs/OnBehalfOf

В типичном сценарии делегирования удостоверения клиент обращается к службе среднего уровня, которая в свою очередь обращается к серверной службе. Служба среднего уровня действует в качестве клиента или от его лица. (Дополнительные сведения см. в разделе "ActAs и OnBehalfOf" статьи Вопросы и ответы.) Эти данные передаются издателю WS-Trust с использованием элементов маркера ActAs и OnBehalfOf в маркере безопасности запроса.

WCF предоставляет точку расширения в привязке, которая позволяет добавлять произвольные XML-элементы в маркер безопасности запроса. Однако в связи с тем, что точка расширения соединена с привязкой, сценарии, для которых необходимо различное содержимое маркера безопасности запроса для различных вызовов, должны заново создавать клиент для каждого вызова, что приводит к снижению производительности. WIF использует методы расширения в классе ChannelFactory, которые позволяют разработчикам добавлять любые маркеры, полученные вне привязки к маркеру безопасности запроса. В приведенном ниже примере кода показано, как получить маркер, представляющий клиент (например, X.509, имя пользователя или маркер SAML), и присоединить его к маркеру безопасности запроса, который отправляется издателю.

  Копировать код
IHelloService serviceChannel = channelFactory.CreateChannelActingAs<IHelloService>( clientSamlToken ); serviceChannel.Hello("Hi!");

WIF предоставляет следующие преимущества.

  • Маркер безопасности запроса может быть изменен для отдельного канала; поэтому службам среднего уровня больше не требуется заново создавать фабрику канала для каждого клиента, что способствует увеличению производительности.

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

Однако возможность отслеживать взаимодействие клиента со службой STS по-прежнему отсутствует. В третьем сценарии этот вопрос будет рассмотрен подробно.

Непосредственная связь с издателем и использование выданного маркера для проверки подлинности

Для некоторых более сложных сценариев недостаточно простого расширения клиента WCF. Разработчики, работающие только с WCF, как правило, используют контракты Message In/Message Out и вручную обрабатывают клиентский анализ ответа издателя.

В WIF добавлены классы WSTrustChannelFactory и WSTrustChannel, позволяющие клиенту обращаться непосредственно к издателю WS-Trust. Классы WSTrustChannelFactory и WSTrustChannel разрешают объектам маркера безопасности запроса и ответа маркера безопасности запроса со строгим типом перемещаться между клиентом и издателем, как показано в следующем примере кода.

  Копировать код
WSTrustChannelFactory trustChannelFactory = new WSTrustChannelFactory( stsBinding, stsAddress ); WSTrustChannel channel = (WSTrustChannel) trustChannelFactory.CreateChannel(); RequestSecurityToken rst = new RequestSecurityToken(RequestTypes.Issue); rst.AppliesTo = new EndpointAddress(serviceAddress); RequestSecurityTokenResponse rstr = null; SecurityToken token = channel.Issue(rst, out rstr);

Обратите внимание, что параметр out в методе Issue разрешает доступ к ответу маркера безопасности запроса для клиентской проверки.

Итак, мы рассмотрели только способ получения маркера. Маркер, возвращаемый из объекта WSTrustChannel, представляет собой маркер GenericXmlSecurityToken, содержащий все данные, необходимые для проверки подлинности для проверяющей стороны. В следующем примере кода показано, как используется этот маркер.

  Копировать код
IHelloService serviceChannel = channelFactory.CreateChannelWithIssuedToken<IHelloService>( token ); serviceChannel.Hello("Hi!");

Метод расширения CreateChannelWithIssuedToken в объекте ChannelFactory сообщает WIF о том, что получен маркер без привязки, а также о том, что необходимо завершить нормальный вызов WCF издателя и вместо этого использовать полученный маркер в целях проверки подлинности для проверяющей стороны. Такой подход имеет следующие преимущества.

  • Обеспечение полного контроля над процессом выдачи маркеров.

  • Поддержка сценариев ActAs/OnBehalfOf путем непосредственной настройки данных свойств исходящих маркеров безопасности запроса.

  • Возможность принятия решений о доверии на стороне клиента с учетом содержимого ответа маркера безопасности запроса.

  • Возможность кэширования и повторного использования маркера, возвращенного методом Issue.

  • Возможность использования WSTrustChannelFactory и WSTrustChannel для управления кэшированием канала, ошибками и семантикой восстановления в соответствии с рекомендациями WCF.

Дополнительные сведения см. в примере Extensibility/WSTrustChannel в папке установки WIF.