ID 委任のシナリオ

このシナリオでは、ID 委任チェーンでのアクセス制御のチェックの実行が必要なバックエンド リソースにアクセスする必要があるアプリケーションについて説明します。 簡単な ID 委任チェーンは、通常、最初の呼び出し元に関する情報と直前の呼び出し元の ID で構成されます。

現在の Windows プラットフォームの Kerberos 委任モデルでは、バックエンド リソースは直前の呼び出し元の ID にのみアクセスでき、最初の呼び出し元の ID にはアクセスできません。 このモデルは、一般的に、信頼されたサブシステム モデルと呼ばれています。 WIF では、Actor プロパティを使用して、委任チェーンの最初の呼び出し元と直前の呼び出し元の ID を保持します。

次の図は、Fabrikam の従業員が Contoso.com のアプリケーションで公開されているリソースにアクセスする場合の一般的な ID 委任のシナリオを示したものです。

edba2b94-848b-468f-8871-c90802638aad

このシナリオに参加する架空のユーザーを次に示します。

  • Frank: Contoso のリソースにアクセスする必要がある Fabrikam の従業員。

  • Daniel: アプリケーションに必要な変更を実装する Contoso のアプリケーション開発者。

  • Adam: Contoso の IT 管理者。

このシナリオで使用するコンポーネントを次に示します。

  • web1: 最初の呼び出し元の委任された ID を必要とするバックエンド リソースへのリンクを含む Web アプリケーション。 このアプリケーションは、ASP.NET を使用して構築されています。

  • 最初の呼び出し元と直前の呼び出し元の委任された ID を必要とする、SQL Server にアクセスする Web サービス。 このサービスは、WCF を使用して構築されています。

  • sts1: 要求プロバイダーの役割を持ち、アプリケーション (web1) が必要としている要求を発行する STS。 Fabrikam.com およびアプリケーションと信頼を確立しています。

  • sts2: Fabrikam.com の ID プロバイダーの役割を持ち、Fabrikam 従業員の認証のエンド ポイントを提供する STS。 Contoso.com と信頼を確立しています。そのため、Fabrikam の従業員は、Contoso.com のリソースにアクセスできます。

"ActAs トークン" という用語がこのシナリオでは頻繁に使用されていますが、これは STS によって発行され、ユーザーの ID を格納しているトークンを表しています。 Actor プロパティには、STS の ID が格納されます。

前の図に示すように、このシナリオの流れは次のとおりです。

  1. Contoso のアプリケーションは、Actor プロパティに Fabrikam の従業員の ID と直前の呼び出し元の ID の両方を格納している ActAs トークンを取得するように構成されています。 Daniel が、これらの変更をアプリケーションに実装しました。

  2. Contoso のアプリケーションは、ActAs トークンをバックエンド サービスに渡すように構成されています。 Daniel が、これらの変更をアプリケーションに実装しました。

  3. Contoso の Web サービスは、sts1 を呼び出して ActAs トークンを検証するように構成されています。 Adam が、sts1 で委任要求を処理できるようにしました。

  4. Fabrikam のユーザーである Frank が、Contoso のアプリケーションにアクセスし、バックエンド リソースへのアクセス許可を受けます。

このシナリオに必要な基本的な手順

このサンプル シナリオは、説明することのみを目的としています。 このシナリオを運用環境で実現するために必要な実際の手順とは異なる場合があります。

ID プロバイダー (IP) の設定

Fabrikam.com の管理者である Frank には 3 つの選択肢があります。

  1. Active Directory® フェデレーション サービス (AD FS) 2.0 などの STS 製品を購入し、インストールする。

  2. LiveID STS などのクラウド STS 製品を利用する。

  3. WIF を使用して、カスタム STS を構築する。

このサンプル シナリオでは、Frank は 1 番目の選択肢を選び、IP-STS として をインストールしたものとします。 また、Frank は、ユーザーを認証するために、\windowsauth という名前のエンド ポイントを構成します。 さらに、 の製品ドキュメントを参照し、Contoso の IT 管理者である Adam と相談して、Contoso.com ドメインと信頼を確立します。

要求プロバイダーの設定

Contoso.com の管理者である Adam にも、先ほど説明した ID プロバイダーの場合と同じ選択肢があります。 このサンプル シナリオでは、Adam は 1 番目の選択肢を選び、RP-STS として をインストールしたものとします。

IP およびアプリケーションとの信頼の設定

Adam は、 の製品ドキュメントを参照して、Fabrikam.com とアプリケーションの間に信頼を確立します。

委任の設定

には、委任処理機能があります。 Adam は、 の製品ドキュメントを参照して、ActAs トークンの処理を有効にします。

アプリケーション固有の変更

次の変更を行って、ID 委任のサポートを既存のアプリケーションに追加する必要があります。 Daniel は、WIF を使用して、これらの変更を行います。

  • web1 が sts1 から受け取ったブートストラップ トークンをキャッシュする。

  • 発行されたトークンと共に CreateChannelActingAs を使用して、バックエンド Web サービスへのチャネルを作成する。

  • バックエンド サービスのメソッドを呼び出す。

ブートストラップ トークンのキャッシュ

ブートストラップ トークンは、STS によって発行される最初のトークンです。アプリケーションは、そのトークンから要求を抽出します。 このサンプル シナリオでは、このトークンはユーザーである Frank のために sts1 から発行され、アプリケーションによってキャッシュされます。 次のコード例では、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 には、指定したセキュリティ トークンを ActAs 要素として使用して、トークンの発行要求を拡張する指定した種類のチャネルを作成するメソッド CreateChannelActingAs が用意されています。 ブートストラップ トークンをこのメソッドに渡し、返されたチャネルで必要なサービス メソッドを呼び出すことができます。 このサンプル シナリオでは、Frank の ID には、web1 の ID に設定されている Actor プロパティがあります。

次のコード スニペットでは、CreateChannelActingAs を使用して Web サービスを呼び出し、返されたチャネルでサービスのメソッドの 1 つである 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(); }

Web サービス固有の変更

Web サービスは WCF を使用して構築されており、WIF に対して有効になっています。そのため、IssuedSecurityTokenParameters で適切な発行者アドレスを指定してバインディングを構成すると、ActAs の検証は WIF によって自動的に処理されます。

Web サービスによって、アプリケーションで必要な特定のメソッドが公開されます。 サービス側で特に必要なコード変更はありません。 次のコード サンプルでは、IssuedSecurityTokenParameters を使用した、Web サービスの構成を示します。

// 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( "https://localhost:6000/STS/mex" ); itp.IssuerAddress = new EndpointAddress( "https://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( "https://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(); }

サンプル リソース

エンド ツー エンドの完全なサンプルについては、サンプル End-to-end\Identity Delegation を参照してください。 このサンプルは、2 つのカスタム STS、1 つの RP、および 1 つの Web サービスを使用する単一のシステムで動作するようになっています。