Сценарий делегирования удостоверений с 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.
Вымышленные пользователи, участвующие в этом сценарии, :
- Фрэнк: сотрудник 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.
Как показано на предыдущей схеме, поток в этом сценарии:
- Приложение Contoso настроено для получения маркера ActAs, содержащего удостоверение сотрудника Fabrikam и идентификатор немедленного вызывающего объекта в свойстве Actor. Даниэль реализовал эти изменения в приложении.
- Приложение Contoso настроено для передачи маркера ActAs в серверную службу. Даниэль реализовал эти изменения в приложении.
- Веб-служба Contoso настроена для проверки маркера ActAs путем вызова sts1. Адам включил sts1 для обработки запросов делегирования.
- Пользователь Fabrikam Франк обращается к приложению Contoso и получает доступ к внутренним ресурсам.
Настройка поставщика удостоверений (IP-адрес)
Существует три варианта для администратора Fabrikam.com Фрэнка:
- Приобретите и установите продукт STS, например службы федерации Active Directory® (AD FS).
- Подпишитесь на облачный продукт STS, например LiveID STS.
- Создание пользовательской службы 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();
}