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

Модель делегирования Kerberos, применяемая в настоящее время на платформе Windows, обеспечивает серверным ресурсам доступ только к удостоверению непосредственной вызывающей стороны, но не начальной вызывающей стороны. Такую модель часто называют моделью доверенной подсистемы. WIF поддерживает удостоверение начальной и непосредственной вызывающих сторон в цепочке делегирования с помощью свойства Actor.

Приведенная ниже диаграмма иллюстрирует типичный сценарий делегирования удостоверения, в котором сотрудник Fabrikam получает доступ к ресурсам, содержащимся в приложении Contoso.com.

В сценарии участвуют следующие вымышленные пользователи:

  • Фрэнк: сотрудник Fabrikam, которому требуется доступ к ресурсам Contoso.

  • Дмитрий: разработчик приложения Contoso, вносящий в него необходимые изменения.

  • Андрей: системный администратор компании Contoso.

Компоненты, задействованные в сценарии:

  • web1: веб-приложение, связанное с серверными ресурсами, которому требуется делегированное удостоверение начальной вызывающей стороны. Это приложение создано с использованием ASP.NET.

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

  • sts1: служба STS, выполняющая функции поставщика утверждений и выдающая утверждения, которые необходимы приложению (web1). Эта служба установила отношения доверия с Fabrikam.com и с приложением.

  • sts2: служба STS, выполняющая функции поставщика удостоверений для Fabrikam.com и предоставляющая конечную точку, которая используется сотрудником Fabrikam для проверки подлинности. Эта служба установила отношения доверия с Contoso.com, чтобы сотрудники Fabrikam имели доступ к ресурсам Contoso.com.

Обратите внимание, что термин "маркер ActAs", часто используемый в этом сценарии, относится к маркеру, выданному службой STS, и включает удостоверение пользователя. Свойство Actor содержит удостоверение службы STS.

Как показано на предыдущей диаграмме, в данном сценарии используется следующий поток.

  1. Приложение Contoso настроено на получение маркера ActAs, содержащего удостоверение сотрудника Fabrikam и удостоверение непосредственной вызывающей стороны в свойстве Actor. Даниэль внес эти изменения в приложение.

  2. Приложение Contoso настроено на передачу маркера ActAs серверной службе. Даниэль внес эти изменения в приложение.

  3. Веб-служба Contoso настроена на проверку маркера ActAs путем обращения к службе sts1. Адам включил обработку запросов делегирования службой sts1.

  4. Пользователь Fabrikam Фрэнк получает доступ к приложению Contoso и серверным ресурсам.

Основные этапы сценария

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

Настройка поставщика удостоверений

Для администратора Fabrikam.com, Владимира, возможно три варианта действий:

  1. Приобрести и установить службу STS, такую как Службы федерации Active Directory® (AD FS) 2.0.

  2. Подписаться на веб-службу STS, такую как LiveID STS.

  3. Создать пользовательскую службу STS с использованием WIF.

В рамках данного сценария мы будем предполагать, что Фрэнк выбрал первый вариант и установил в качестве службы STS и поставщика удостоверений. Кроме того, он настроил конечную точку \windowsauth для проверки подлинности пользователей. После ознакомления с документацией по продукту и беседы с Адамом, ИТ-администратором Contoso, Фрэнк установил отношение доверия с доменом Contoso.com.

Настройка поставщика утверждений

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

Настройка отношения доверия с поставщиком удостоверений и приложением

После ознакомления с документацией по продукту Адам установил отношение доверия между Fabrikam.com и приложением.

Настройка делегирования

обеспечивает обработку делегирования. После ознакомления с документацией по продукту Адам включил обработку маркеров ActAs.

Изменения для конкретного приложения

Указанные ниже изменения должны быть реализованы для добавления поддержки делегирования удостоверений существующему приложению. Даниэль воспользовался WIF для внесения этих изменений.

  • Кэширование маркера начальной загрузки, получаемого приложением web1 от службы sts1.

  • Использование CreateChannelActingAs с выданным маркером для создания канала к серверной веб-службе.

  • Вызов метода серверной службы.

Кэширование маркера начальной загрузки

Маркер начальной загрузки — это первый маркер, выданный службой STS, из которого приложение извлекает утверждения. В рамках данного сценария этот маркер выдан службой sts1 Фрэнку, и приложение выполняет его кэширование. В приведенном ниже примере кода показано, как получить маркер начальной загрузки в приложении ASP.NET.

  Копировать код
// Получение маркера начальной загрузки SecurityToken bootstrapToken = null;

IClaimsPrincipal claimsPrincipal = Thread.CurrentPrincipal as IClaimsPrincipal; if ( claimsPrincipal != null ) { IClaimsIdentity claimsIdentity = (IClaimsIdentity)claimsPrincipal.Identity; bootstrapToken = claimsIdentity.BootstrapToken; }

WIF предусматривает метод CreateChannelActingAs, который создает канал определенного типа, расширяющий запросы выдачи маркеров за счет указанного маркера безопасности в качестве элемента ActAs. Маркер начальной загрузки можно передать этому методу, а затем вызвать метод необходимой службы по возвращенному каналу. В рамках данного сценария свойство Actor удостоверения Фрэнка настроено на удостоверение приложения web1.

В следующем фрагменте кода показано, как вызвать веб-службу с CreateChannelActingAs, а затем вызвать один из методов службы, ComputeResponse, по возвращенному каналу.

  Копировать код
// Получение фабрики канала для серверной службы из состояния приложения ChannelFactory<IService2Channel> factory = (ChannelFactory<IService2Channel>)Application[Global.CachedChannelFactory];

// Создание и настройка канала для связи с серверной службой IService2Channel channel; lock (factory) { // Настройка элемента ActAs для указания на маркер вызывающей стороны для обеспечения // делегированного обращения к серверной службе // от имени исходной вызывающей стороны. channel = factory.CreateChannelActingAs<IService2Channel>(callerToken); }

string retval = null;

// Вызов серверной службы и обработка возможных исключений try { retval = channel.ComputeResponse(value); channel.Close(); } catch (Exception exception) { StringBuilder sb = new StringBuilder(); sb.AppendLine("An unexpected exception occurred."); sb.AppendLine(exception.StackTrace); channel.Abort(); retval = sb.ToString(); }

Изменения для конкретной веб-службы

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

Веб-служба предоставляет специальные методы, требуемые приложению. В службу не требуется вносить никаких особых изменений в коде. В приведенном ниже примере кода показана настройка веб-службы с помощью параметров IssuedSecurityTokenParameters:

  Копировать код
// Настройка правильных параметров выданного маркера IssuedSecurityTokenParameters itp = new IssuedSecurityTokenParameters( "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1" ); itp.IssuerMetadataAddress = new EndpointAddress( "http://localhost:6000/STS/mex" ); itp.IssuerAddress = new EndpointAddress( "http://localhost:6000/STS" );

// Создание элемента привязки безопасности SecurityBindingElement sbe = SecurityBindingElement.CreateIssuedTokenForCertificateBindingElement( itp ); sbe.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;

// Создание элемента привязки транспорта HTTP HttpTransportBindingElement httpBE = new HttpTransportBindingElement();

// Создание пользовательской привязки с использованием подготовленных элементов привязки CustomBinding binding = new CustomBinding( sbe, httpBE );

using ( ServiceHost host = new ServiceHost( typeof( Service2 ), new Uri( "http://localhost:6002/Service2" ) ) ) { host.AddServiceEndpoint( typeof( IService2 ), binding, "" ); host.Credentials.ServiceCertificate.SetCertificate( "CN=localhost", StoreLocation.LocalMachine, StoreName.My );

// Включение создания метаданных по протоколу HTTP GET ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; host.Description.Behaviors.Add( smb ); host.AddServiceEndpoint( typeof( IMetadataExchange ), MetadataExchangeBindings.CreateMexHttpBinding(), "mex" );

// Настройка узла службы на использование WIF ServiceConfiguration configuration = new ServiceConfiguration(); configuration.IssuerNameRegistry = new TrustedIssuerNameRegistry();

	FederatedServiceCredentials.ConfigureServiceHost( host, configuration );

	host.Open();

	Console.WriteLine( "Service2 started, press ENTER to stop ..." ); Console.ReadLine();

	host.Close(); }

Примеры ресурсов

Пример полностью см. в примере End-to-end\Identity Delegation. Обратите внимание, что данный пример подразумевает работу в одной системе с двумя пользовательскими службами STS, проверяющей стороной и веб-службой.