Сценарий делегирования удостоверений с AD FS

[Начиная с платформа .NET Framework 4.5, Windows Identity Foundation (WIF) полностью интегрирован в платформа .NET Framework. Версия WIF, рассмотренная в этом разделе, WIF 3.5, устарела и должна использоваться только при разработке для платформа .NET Framework 3.5 с пакетом обновления 1 (SP1) или платформа .NET Framework 4. Дополнительные сведения о WIF в платформа .NET Framework 4.5, также известных как WIF 4.5, см. в документации по Windows Identity Foundation в руководстве по разработке платформа .NET Framework 4.5.5.]

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

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

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

Identity

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

  • Фрэнк: сотрудник 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, и содержит удостоверение пользователя. Свойство "Субъект" содержит удостоверение STS.

Как показано на предыдущей схеме, поток в этом сценарии:

  1. Приложение Contoso настроено для получения маркера ActAs, содержащего удостоверение сотрудника Fabrikam и идентификатор немедленного вызывающего объекта в свойстве Actor. Даниэль реализовал эти изменения в приложении.
  2. Приложение Contoso настроено для передачи маркера ActAs в серверную службу. Даниэль реализовал эти изменения в приложении.
  3. Веб-служба Contoso настроена для проверки маркера ActAs путем вызова sts1. Адам включил sts1 для обработки запросов делегирования.
  4. Пользователь Fabrikam Франк обращается к приложению Contoso и получает доступ к внутренним ресурсам.

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

Существует три варианта для администратора Fabrikam.com Фрэнка:

  1. Приобретите и установите продукт STS, например службы федерации Active Directory® (AD FS).
  2. Подпишитесь на облачный продукт STS, например LiveID STS.
  3. Создание пользовательской службы STS с помощью WIF.

В этом примере предполагается, что Фрэнк выбирает вариант1 и устанавливает AD FS в качестве IP-STS. Он также настраивает конечную точку с именем \windowsauth для проверки подлинности пользователей. Ссылаясь на документацию по продукту AD FS и поговорив с Адамом, ИТ-администратором Contoso, Фрэнк устанавливает доверие к домену Contoso.com.

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

Параметры, доступные администратору Contoso.com Адаму, аналогичны описанным ранее для поставщика удостоверений. В этом примере предполагается, что Адам выбирает вариант 1 и устанавливает AD FS 2.0 в качестве RP-STS.

Настройка доверия с IP-адресом и приложением

Ссылаясь на документацию AD FS, Адам устанавливает доверие между Fabrikam.com и приложением.

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

AD FS обеспечивает обработку делегирования. Ссылаясь на документацию AD FS, Адам обеспечивает обработку токенов ActAs.

Изменения, связанные с приложением

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

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

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

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

// Get the Bootstrap Token
SecurityToken bootstrapToken = null;

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

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

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

// Get the channel factory to the backend service from the application state
ChannelFactory<IService2Channel> factory = (ChannelFactory<IService2Channel>)Application[Global.CachedChannelFactory];

// Create and setup channel to talk to the backend service
IService2Channel channel;
lock (factory)
{
// Setup the ActAs to point to the caller's token so that we perform a
// delegated call to the backend service
// on behalf of the original caller.
    channel = factory.CreateChannelActingAs<IService2Channel>(callerToken);
}

string retval = null;

// Call the backend service and handle the possible exceptions
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, после настройки привязки с помощью IssueSecurityTokenParameters с соответствующим адресом издателя проверка actAs автоматически обрабатывается WIF.

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

// Configure the issued token parameters with the correct settings
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" );

// Create the security binding element
SecurityBindingElement sbe = SecurityBindingElement.CreateIssuedTokenForCertificateBindingElement( itp );
sbe.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;

// Create the HTTP transport binding element
HttpTransportBindingElement httpBE = new HttpTransportBindingElement();

// Create the custom binding using the prepared binding elements
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 );

// Enable metadata generation via HTTP GET
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    host.Description.Behaviors.Add( smb );
    host.AddServiceEndpoint( typeof( IMetadataExchange ), MetadataExchangeBindings.CreateMexHttpBinding(), "mex" );

// Configure the service host to use 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();
}

Next Steps

Разработка AD FS