この項には、カスタム・エンジンの実装に関連する次の内容が含まれています。
デフォルトでは、Oracle Identity Federationは、Oracle Access Manager、Oracle AS Single Sign-Onなどの複数のIDおよびアクセス管理(IAM)製品と統合されます。詳細は、第5.15項「認証エンジンの構成」および第5.16項「SP統合モジュールの構成」を参照してください。
この項では、カスタムIAM製品に対するフレームワークのコンポーネントについて説明し、カスタムIAMソリューションを構成してこのフレームワークに統合する方法を示します。
注意: この項で説明されているカスタム統合および認証用以外のアプリケーションをOracle WebLogic管理対象サーバーにデプロイすると、セキュリティ上のリスクが発生する可能性があるため、そのようなデプロイは行わないことをお薦めします。無関係なアプリケーションをOracle WebLogic管理対象サーバーにデプロイしたすると、悪意のあるソフトウェアによってサーバー・フローの動作が変更される可能性があるため、フェデレーション・サーバーのセキュリティに悪影響を及ぼすことがあります。 |
実行時に、Oracle Identity Federationは2種類の外部モジュール(ユーザー・データ・ストアと、IDおよびアクセス管理(IAM)システム)と相互作用します。
Oracle Identity Federationがユーザー・データ・ストアと連携する目的は次のとおりです。
ローカル認証後のユーザーの検索
着信SAMLアサーションの処理後のユーザーの検索
特定のユーザーの属性の取得
IDおよびアクセス管理(IAM)システムは、保護されたリソースに対するアクセスを制御します。Oracle Identity Federationがフェデレーション・サーバーとしてIAMと相互作用する目的は次のとおりです。
サーバーがユーザーのローカルIDを取得する必要がある場合にユーザーを認証します。この操作は、サーバーがIdPとして機能する場合、またはSPとして機能するサーバーが初期アカウント・リンク/フェデレーション作成中にユーザーを認証する必要がある場合に行われることがあります。
サーバーが着信SAMLアサーションを処理し、特定のユーザーのIDをIAMシステムに対して宣言する場合に、そのユーザー用の認証済セッションを作成します。
ログアウト・フローを処理します。この場合、フェデレーション・サーバーは、ユーザーをシステムからログアウトさせるIAM機能を起動します。
図3-1に、Oracle Identity Federationデプロイメントの複数の外部および内部モジュールと、各モジュールが実行時に相互作用する方法を示します。
ここでは、わかりやすいように、Oracle Identity Federationを次の3つの内部モジュールとして示します。
アイデンティティ・フェデレーション・エンジン。AuthnRequest、アサーションおよびログアウトなどのSAMLメッセージの作成および処理を行います。
このモジュールの機能は次のとおりです。
SAMLメッセージの処理時に、ユーザー・データ・ストアと連携します。
ユーザーをローカルに識別する必要がある場合に、認証エンジンと相互作用します。
アサーションの処理後にユーザーがIAMコンポーネントにリダイレクトされる際に、SP統合エンジンと相互作用します。
認証エンジン。フェデレーション・エンジンからのリクエストを処理してユーザーを認証します。このモジュールはIAMコンポーネントおよびユーザー・データ・ストアと相互作用して、ユーザーの認証と、Oracle Identity Federationでユーザーの参照に使用される一意の識別子の取得を実行します。
このモジュールは、ローカル認証が必要な場合に、IdPまたはSPモードで起動できます。
ユーザーの認証後、認証エンジンは、ユーザー識別子や認証時刻およびその他のデータなどの認証情報をフェデレーション・エンジンに送信します。
フェデレーション・エンジンは、着信SAMLアサーションを正常に処理し、アサーションで参照されるユーザーを検索した後、そのユーザー用の認証済セッションをIAMドメインで作成するようにSP統合エンジンに指示します。必要な情報(ユーザー識別子、認証時刻など)をSP統合エンジンに渡します。SP統合エンジンは、IAMサーバーと相互作用してこのセッションを作成します。
Oracle Identity Federationの認証エンジン・フレームワークはユーザーを認証するように設計されており、デフォルトでサポートされている各種のIAMサーバーとの相互作用を可能にする複数の内部プラグインが含まれています。
Oracle Single Sign-On
Oracle Access Manager
LDAPサーバーを使用したユーザー名/パスワード
RDBMSサーバーを使用したユーザー名/パスワード
RDBMS表を使用したユーザー名/パスワード
情報カード
フェデレーションSSOプロキシ
JAAS
また、Oracle Identity Federationはサード・パーティ認証モジュールとのサーバーの統合を可能にするフレームワークも提供します。インテグレータは、次の2つの方法を使用して、他の認証プラットフォームと相互作用するようにOracle Identity Federationをカスタマイズできます。
JavaEEサーブレット転送を使用してOracle Identity Federationと相互作用する認証モジュールを設計し、実装する。新しいモジュールは、ユーザーを認証する役割を果たすサード・パーティ認証ソリューションにもリンクされます。
特定のログイン・モジュールを使用するようにJAASを利用する。Oracle Identity Federationには内部転送に基づく認証エンジンが含まれており、これはJAASライブラリを使用してユーザーを認証します。これにより、インテグレータはOracle Identity Federationを構成することによって、既存のJAAS準拠のログイン・モジュールをOracle Identity Federationサーバー・モジュールで再利用することが可能になります。
ここでは、認証エンジンが一般的なユーザー・フローで他のコンポーネントと相互作用する方法を段階的に説明します(Oracle Identity Federationはフェデレーション・サーバーとも呼ばれます)。
ユーザーがOracle Identity FederationにアクセスしてSSO処理を行います(SPまたはIdPモード)。
サーバー内の内部プロセスが、特定の認証メカニズム(構成で指定されたデフォルトのメカニズムまたはリモート・サービス・プロバイダによってリクエストされたメカニズム)を使用してユーザーを識別する必要があることを判断します。
フェデレーション・サーバーが、指定された認証メカニズムに対して、ユーザーをチャレンジ/識別するために使用する認証エンジンを決定します。
次に、フェデレーション・サーバーはユーザーをチャレンジ/識別する認証エンジンのWebコンテキストおよびログイン相対パスにユーザーのリクエストを内部的に転送し、HttpServletRequest
インスタンスの属性として格納されているJavaオブジェクトで指定された次のような情報を渡します。
ユーザーのIDのチャレンジ時に使用する認証メカニズム。
実行されている現在のアクションを参照する識別子。
フェデレーションSSO処理が行われている場合は、このローカル認証をリクエストしているリモート・サービス・プロバイダのProviderID
と説明。
ユーザーの認証に使用するエンジンを参照する識別子。
ユーザーの識別子。
ユーザーがすでに認証済でもエンジンがユーザーをチャレンジすべきかどうかを示すForce Authentication
フラグ。
エンジンがユーザーと視覚的に対話可能かどうかを示すIs Passive
フラグ。
オプションで、エンジンが設定する必要がある属性のマップ。これらの属性は、特定のリモート・プロバイダの構成で指定されたとおりに、Oracle Identity Federation/IdPがAttributeStatement
を使用してアサーションを正しく作成するために必要です。
ユーザーがすでにアクティブなセッションを開始している場合は、オプションで、Oracle Identity Federationのセッション識別子を含むString
。Oracle Identity Federationは、認証エンジンがユーザーにリンクされた状態を維持できるように、すでに存在するユーザー・セッション(存在する場合)のセッションIDをエンジンに渡します。またOracle Identity Federationは、sessionID
値を使用してそのデータを参照できます。後でログアウト・フローが実行される際に、このユーザー・セッションに使用されたデータをエンジンが削除できるように、Oracle Identity FederationはログアウトするsessionID
をエンジンに渡します。
認証エンジンが受信リクエストを処理します。認証エンジンは、HttpServletRequest
属性として格納されている情報にアクセスできます。
認証エンジンは、IAMコンポーネントと相互作用し、ユーザーの資格証明を要求する場合があります。認証に成功すると、Cookieを設定する場合があります(IAMサーバーまたはターゲット・アプリケーション、あるいはその両方との認証済セッションを維持するためなど)。
認証モジュールは内部転送(Webコンテキスト/fed
およびログイン相対パス/user/loginsso
)を使用してユーザーをOracle Identity Federationに戻し、次の情報をHttpServletRequest
属性として渡します。
ユーザーの識別子。
認証時刻
認証済セッションの有効期限
ユーザーの識別に使用した認証メカニズム
リクエストからの、実行されたアクションを参照する識別子
ユーザーの認証に使用するエンジンを参照する識別子。
オプションで、ユーザー・セッションに格納されている属性のマップ。
オプションで、Oracle Identity FederationがOracle Identity Federationユーザー・セッションの参照に使用する必要があるOracle Identity Federationのセッション識別子を含む文字列。これにより、エンジンとOracle Identity Federationは、同じ識別子を共有してユーザー・セッションを参照できます。後でログアウト・フローが実行される際に、このユーザー・セッションに使用されたデータをエンジンが削除できるように、Oracle Identity FederationはログアウトするsessionID
をエンジンに渡します。
注意:
|
Oracle Identity Federationが次のアクションを実行します。
受信リクエストの処理
属性としてHttpServletRequest
に埋め込まれたデータの取得
ユーザー・データ・ストアでのユーザーの検索
ユーザー用のセッションの作成
Cookieの設定
SSO処理の再開
Oracle Identity Federationに付属のSP統合エンジンは、サーバーからのリクエストを処理してIAMサーバーでユーザー用の認証済セッションを作成するサーブレットで構成されています。このエンジンには、次のような複数のIAMサーバーとの相互作用を可能にする複数の内部プラグインが含まれています。
Oracle Single Sign-On
Oracle Access Manager
Oracle Identity Federationテスト・アプリケーション
また、Oracle Identity Federationでは、サーバーとサード・パーティのIAMフレームワークとの統合を可能にするフレームワークが提供されています。カスタマイズされたSP統合モジュールが内部のJ2EEサーブレット転送を使用してOracle Identity Federationと対話し、サード・パーティのIAMシステムと通信して認証済ユーザー・セッションを作成します。
ここでは、SP統合エンジンが一般的なユーザー・フローでOracle Identity Federationフレームワークと相互作用する方法を段階的に説明します。
ユーザーが、IAMソリューションにより保護され、ユーザーの認証にフェデレーションSSOを使用するように構成されているリソースへのアクセスを試みます。
IAMデプロイメントが、Oracle Identity Federation上の対応するSP統合モジュールにユーザーをリダイレクトします。
SP統合モジュールがIAMデプロイメントによって送信された情報をデコードし、次の情報をHttpServletRequest
属性として設定して、ユーザーをOracle Identity Federationサーバーに内部転送します。
認証時に使用するようにIdPにリクエストする認証メカニズムをSPに対して指定する、オプションの認証メカニズム。
注意: 設定した場合、このパラメータは使用すべきIdPを決定するために使用されます。この場合、次に説明するデフォルト・パラメータは無視されます。 |
フェデレーションSSOで使用するIdPを参照する、オプションのプロバイダID。指定されていない場合、Oracle Identity Federationは指定された認証メカニズムにマップされたIdPを使用します。IdPが見つからなかった場合は、Oracle Identity FederationはデフォルトSSO IdPとして構成されているIdPを使用します。
フェデレーションSSOのトリガーに使用するアフィリエーションを参照する、オプションのフェデレーションID。
リレー状態。リポジトリに保存されたデータへの参照などの短い文字列、またはSSO処理の完了後にユーザーをリダイレクトする保護リソースを指す短いURLを含めることができます。
SSOフローを開始したSPエンジンの識別子。
Oracle Identity Federationサーバーが認証エンジンを使用してユーザーをローカルに認証すべきか、またはユーザーを認証用にIdPにリダイレクトすることによりフェデレーションSSOを開始すべきかを示す、オプションのブール値。
Oracle Identity Federationに格納されている構成を使用するか、またはSPエンジンによって渡された、IdP以外の情報に基づいてSSO処理のみを開始するかを示す、Boolean
オブジェクト。
ユーザーが認証済の場合でもユーザーをチャレンジするようにSPからIdPに指示するかどうかを示す、Boolean
オブジェクト。
SSO処理中に、フェデレーション・レコードがまだ存在しない場合はレコードを作成するようにSPがIdPに対して許可するかどうかを示す、Boolean
オブジェクト。
SSO処理中にIdPとユーザーとの間で対話が行われないようにSPが指示するかどうかを示す、Boolean
オブジェクト。
AuthnRequest
の送信時に使用するバインディングを表すString
。
アサーションを含むレスポンスの送信時に使用するバインディングを表すString
。
IdPでの認証時に使用する認証コンテキスト比較をリクエストする場合にSPに対して指定する、オプションの認証メカニズム比較。
SSO処理に関してSPがIdPに問い合せるために使用する名前IDフォーマットを表すString
。
Oracle Identity Federationが、リモートIdPとの間でフェデレーションSSO処理を開始します。
IdPがユーザーを認証し、必要に応じてユーザーをアサーションとともに、SPとして機能するフェデレーション・サーバーにリダイレクトします。
サーバーがアサーションを処理し、ユーザーをユーザー・データ・ストアで検索します。これで、ユーザーがフェデレーション・サーバーで認証されます。
Oracle Identity Federationが、Oracle Identity Federation内で構成されているSP統合モジュールのWebコンテキストとログイン相対パスを使用して、ユーザーをSP統合モジュールに内部的に転送して戻します。サーバーは次のデータをHttpServletRequest
属性として渡します。
SSO処理が成功したかどうかを示すBoolean
オブジェクト
ユーザーの識別子。
認証時刻
認証済セッションの有効期限
ユーザーの識別に使用した認証メカニズム
リレー状態
アサーションの内容(NameID
、アサーションのIssuer
およびオプションの属性)。注意: アサーションの内容はXMLデータとしては渡されません。つまり、元のアサーションはモジュールには戻されません。追加のデータは次のように参照されます。
名前ID値を含むorafed-nameid-value
名前ID修飾子を含むorafed-nameid-qualifier
名前IDフォーマットを含むorafed-nameid-format
ピア・プロバイダIDを含むorafed-providerid
SAMLレスポンスの最高ステータス
SAMLレスポンスの低ステータス(存在する場合)
ステータス・メッセージ(存在する場合)
SSOアサーションを作成したProviderID
前述の情報を処理するSPエンジンの識別子
ユーザー・セッションのOracle Identity Federation識別子を含むString
。Oracle Identity Federationは、SPエンジンがユーザーにリンクされた状態を維持できるように、ユーザー・セッションのセッションIDを渡します。またOracle Identity Federationは、sessionID
値を使用してそのデータを参照できます。後でログアウト・フローの実行時に、このユーザー・セッションで使用されたデータをエンジンが削除できるように、Oracle Identity FederationはログアウトするセッションIDをエンジンに渡します。
SP統合エンジンが、IAMサーバーと相互作用して、ユーザー用の認証済セッションを作成します。このセッションは、Oracle Identity Federationから受信されたデータに基づきます。
SP統合エンジンが、ユーザーを最終のターゲットURLにリダイレクトします。
ログアウト時には、Oracle Identity Federationおよび認証またはSPエンジンからログアウトする必要があります。これには、次の操作が含まれます。
認証エンジンからユーザーをログアウトさせます。
SPエンジンからユーザーをログアウトさせます。
SAML/WS-Fedグローバル・ログアウト・プロファイルを実行します。
Oracle Identity Federationからユーザーをログアウトさせます。
ログアウトを呼び出すにはいくつかの方法があります。
ユーザーがオプションの戻りURLを指定することにより、/fed/user/logout
にあるOracle Identity Federationログアウト・サーバーを呼び出します。この場合、Oracle Identity Federationはユーザーを認証エンジンまたはSPエンジン、リモートSAMLプロバイダおよびOracle Identity Federation自体からログアウトさせ、ユーザーを戻りURLにリダイレクトするか、ログアウト結果ページを表示します。
グローバル・ログアウト・プロトコルを使用して、ユーザーをリモートSAML/WS-FedプロバイダからOracle Identity Federationにリダイレクトします。この場合、Oracle Identity Federationはユーザーを認証エンジンまたはSPエンジン、リモートSAML/WS-Fedプロバイダ(ログアウト・メッセージを送信したプロバイダ以外の)およびOracle Identity Federation自体からログアウトさせ、ユーザーを元のメッセージを送信したリモートSAMLプロバイダにリダイレクトして戻します。
ユーザーが、認証エンジンまたはSPエンジンに統合された環境からログアウトを開始します。この場合、この環境によりログアウト用の認証エンジンまたはSPエンジンが呼び出され、そのエンジンがユーザーをログアウト用にOracle Identity Federationに送信します。その後、Oracle Identity Federationがユーザーを認証エンジンまたはSPエンジン(ユーザーをOracle Identity Federationにリダイレクトしたエンジン以外の)およびOracle Identity Federation自体からログアウトさせ、フローを開始した認証エンジンまたはSPエンジンにユーザーをリダイレクトして戻します。
注意: Oracle Identity Federationから認証エンジンまたはSPエンジンへの、また認証エンジンまたはSPエンジンからOracle Identity Federationへのユーザーの送信には、内部転送が使用されます。 |
Oracle Identity Federationによる認証エンジンまたはSPエンジンの呼出し
Oracle Identity Federationは、ユーザーを認証エンジンまたはSPエンジンに送信する際に、次の処理を実行します。
エンジンのWebコンテキストおよび相対ログアウト・パスへの内部転送を実行します。
ログアウト時に呼び出すエンジンのエンジンIDを指定します。
オプションで、ログアウトされるユーザー・セッションの識別子を指定します。
認証エンジンまたはSPエンジンによるユーザーのログアウト時に、エンジンはユーザーをOracle Identity Federationに内部的に転送して戻し、次の処理を実行します。
/fed Webコンテキストおよび/user/logoutretssoへの内部転送を実行します。
呼び出すエンジンのエンジンIDを指定します。
認証エンジンまたはSPエンジンによるOracle Identity Federationの呼出し
認証エンジンまたはSPエンジンは、ログアウト時にOracle Identity Federationを呼び出す場合、次の処理を実行します。
/fed Webコンテキストおよび/user/logoutssoへの内部転送を実行します。
ログアウト時に呼び出すエンジンのエンジンIDを指定します。
Oracle Identity Federationがログアウト後にユーザーをリダイレクトする戻りURLを指定します。
ログアウト・フローの最後に、ユーザーはOracle Identity Federationからログアウトされ、戻りURLにリダイレクトされます。
Oracle Identity Federationは、認証操作およびSP統合に関する特定の要件を満たすよう設計されています(ユーザー・セッションがIAMサーバーで作成される場合)。したがって、カスタム認証エンジンまたはSP統合エンジンの実装時は次の要件を満たす必要があります。
認証エンジン、SP統合エンジン、Oracle Identity FederationエンジンおよびIAMサーバーは、同じユーザー・データ・ストアをユーザー・リポジトリとして使用する必要があります。このストアには、ユーザーの検索および認証に使用されるユーザー・データが含まれています。
認証エンジンおよびSP統合エンジンには、Javaサーブレット/JSPが含まれている必要があります。
Oracle Identity Federationと認証/SP統合エンジンの間のデータ交換は、内部HTTPリクエスト転送を介して行われる必要があります。これは実際には、J2EEサーブレット・フレームワークに依存したモジュール間の内部APIコールであり、HTTPプロトコルを介して行われます。
ログアウト・サービスを実装し、認証エンジンまたはSP統合エンジン(あるいはその両方)がこのサービスを使用できるようにする必要があります。このログアウト・サービスは、サーブレット/JSPとして公開される必要があります。
この項では、カスタム認証エンジンを計画、開発および実装する方法を説明します。
カスタマイズされた認証エンジンの作成には、次の手順が含まれます。
Oracle Identity Federationからの受信リクエストを処理するサービスの作成。
ユーザーを認証するモジュールの実装。
ユーザーを必須情報とともにフェデレーション・サーバーに転送するサービスの作成。
認証エンジンがユーザーの認証後にCookieを設定するかどうかの判断。設定する場合、認証モジュールをログアウト処理と統合する必要があります(第10.5項「ログアウト」を参照)。
サービスおよびモジュールのWebアプリケーションへのパッケージ化と、Oracle Identity Federationが実行されているOracle WebLogic管理対象サーバーへのアプリケーションのデプロイ。
Oracle Identity Federationが新しい認証エンジンを参照するようにするための構成。
認証エンジンによって返されるユーザー識別子が、Oracle Identity Federationユーザー・データ・ストア内の同じユーザーを参照することの確認。
ここでは、モジュール開発のいくつかの側面について説明します。
URL
フェデレーション・エンジンと認証エンジンの間の通信は、APIコールに相当する内部サーブレット転送を介して行われます。これらの転送では、次のJavaEE APIを使用します。
ServletContext.getContext(String contextPath) .getRequestDispatcher(String relativePath) .forward(HttpServletRequest request, HttpServletResponse response)
ここで、
contextPath
は、Webアプリケーションのルート・コンテキスト・パスです。たとえば、Oracle Identity FederationのcontextPath
は/fed
です。
relativePath
は、ユーザーの転送先となるサービスURLであり、contextPath
に相対的です。たとえば、ユーザーの認証後、認証エンジンではユーザーの転送時に/user/loginsso
をrelativePath
として使用します。
Oracle Identity Federationは、新しい認証エンジンのID、contextPath
およびrelativePath
を把握している必要があります。これは、フェデレーション・サーバーが発行した認証リクエストを処理するURLです。
認証エンジンの追加または変更
認証エンジンを追加または変更するには、次の手順を実行します。
Fusion Middleware Controlに移動し、Oracle Identity Federationインスタンスを選択します。
「管理」→「認証エンジン」に移動します。
認証エンジンを追加するには、「追加」をクリックして、認証エンジンの名前を入力します。Oracle Identity Federationにより、新しいエンジンに対するIDが生成されます。
注意: Fusion Middleware Controlでは、名前は表示目的でのみ使用し、Oracle Identity Federationと認証エンジン間の通信ではIDを使用します。 |
認証エンジンを変更するには、認証エンジンを選択して、次の操作を実行します。
エンジンを有効または無効にします。
「Webコンテキスト」フィールドで、認証エンジンのcontextPath
を指定します。
「ログイン相対パス」フィールドに、認証エンジンのログイン・サービスの相対パスを指定します。
ログアウトを有効または無効にします。
「ログアウト相対パス」フィールドに、認証エンジンのログアウト・サービスの相対パスを指定します。
「適用」をクリックします。
サービスの実装
この項では、認証エンジンが実行する役割と、実装を成功させるためにサービスで実行できる必要がある処理タスクについて説明します。
認証エンジンは次を実行する必要があります。
フェデレーション・エンジンからのリクエストの処理
認証成功後のフェデレーション・サーバーへのユーザーの転送
サーバーからの認証リクエストの処理時に、エンジンは次の着信データを処理する必要があります。
ユーザーのIDのチャレンジ時に使用する認証メカニズム(String、oracle.security.fed.authn.authnmechで識別)。
実行中の現在のアクションを参照する識別子(String、oracle.security.fed.authn.refid
で識別)。
フェデレーションSSO処理が行われている場合は、このローカル認証をリクエストしているリモート・サービス・プロバイダのProviderID
と説明(String、oracle.security.fed.authn.providerid
およびoracle.security.fed.authn.providerdescription
で識別)。
ユーザーの認証に使用するエンジンを参照する識別子(oracle.security.fed.authn.engineidで識別)。
設定されている場合は、ユーザーの識別子(String
、oracle.security.fed.authn.useridで識別)。
ユーザーがすでに認証済でもエンジンがユーザーをチャレンジすべきかどうかを示す、強制認証フラグ(Boolean
オブジェクト)。指定されていない場合、Falseとみなされます。(oracle.security.fed.authn.forceauthn
で識別)
エンジンがユーザーと視覚的に対話可能かどうかを示す、Is Passive
フラグ(Boolean
オブジェクト)。指定されていない場合、False
とみなされます。(oracle.security.fed.authn.passive
で識別)
オプションで、エンジンが設定する必要がある属性のマップ。これらの属性は、特定のリモート・プロバイダの構成で指定されたとおりに、Oracle Identity Federation/IdPが属性文を使用してアサーションを正しく作成するために必要です。(oracle.security.fed.authn.attributes
で識別)
Oracle Identity FederationがSSOアサーションを受け取り、処理し、サーバーがアサーションをローカル・ユーザーにマップできなかったためユーザーをローカルに認証することをリクエストすると、マップにはアサーションからの次のデータが含まれます。
orafed-nameid-value
- ユーザーの名前ID値
orafed-nameid-qualifier
- ユーザーの名前ID修飾子
orafed-nameid-format
- ユーザーの名前IDフォーマット
orafed-providerid
- IdPのプロバイダID
orafed-assertionid
- アサーションのID
orafed-xmlmessage
- アサーションを含むオプションのXMLメッセージ
詳細は、第6.13.2項「SSO完了後のSPエンジンへのXMLメッセージの送信」を参照してください。
ユーザーがすでにアクティブなセッションを開始している場合は、オプションで、Oracle Identity Federationのセッション識別子を含むString
。Oracle Identity Federationは、認証エンジンがユーザーにリンクされた状態を維持できるように、すでに存在するユーザー・セッション(存在する場合)のセッションIDをエンジンに渡します。またOracle Identity Federationは、セッションID値を使用してそのデータを参照できます。後でログアウト・フローが実行される際に、このユーザー・セッションで使用されたデータをエンジンが削除できるように、Oracle Identity FederationはログアウトするセッションIDをエンジンに渡します。(oracle.security.fed.sessionid
で識別)。
認証が成功したら、エンジンは、フェデレーション・エンジンのrootContext
である/fed
および相対パス/user/loginsso
を使用して、ユーザーをフェデレーション・サーバーに転送する必要があります。
Oracle Identity Federationでは、内部転送の処理時に次のデータが必要です。
ユーザーの識別子(String
、oracle.security.fed.authn.userid
で識別)
認証時刻(Date
オブジェクト、oracle.security.fed.authn.authntime
で識別)
認証済セッションの有効期限(Date
オブジェクト、oracle.security.fed.authn.expirationtime
で識別)
ユーザーを識別するために使用する認証メカニズム(String、oracle.security.fed.authn.authnmech
で識別)。
リクエストからの、実行されたアクションを参照する識別子(oracle.security.fed.authn.refid
で識別)。
ユーザーの認証に使用するエンジンを参照する識別子(oracle.security.fed.authn.engineid
で識別)。
オプションで、ユーザー・セッションに格納されている属性のマップ。このマップは、キーとしてStringオブジェクトを、値としてオブジェクトのセットを持ちます(oracle.security.fed.authn.attributes
で識別)。
オプションで、Oracle Identity FederationがOracle Identity Federationユーザー・セッションの参照に使用する必要があるOracle Identity Federationのセッション識別子を含むString
。これにより、エンジンとOracle Identity Federationは、同じ識別子を共有してユーザー・セッションを参照できます。後でログアウト・フローが実行される際に、このユーザー・セッションで使用されたデータをエンジンが削除できるように、Oracle Identity FederationはログアウトするセッションIDをエンジンに渡します。(oracle.security.fed.sessionid
で識別)。
注意:
|
さらに、次の追加の実装要件があります。
サービスでCookieを設定する必要がある場合、ユーザーをフェデレーション・サーバーに転送する前にその操作を実行してください。
Cookieのパス値を/に設定します。これは、Oracle Identity FederationのWebアプリケーションと認証エンジンのWebアプリケーション間の内部転送のために必要です。ユーザーのブラウザは、フェデレーション・サーバーにのみアクセスする場合にも、認証エンジンに関連するCookieを送信する必要があります。これにより、フェデレーション・サーバーから認証エンジンへの内部転送時に、エンジンによって設定されたCookieがHTTPリクエストで使用可能になります。
この項では、カスタム認証エンジンをOracle Single Sign-Onと統合する方法を説明します。
設定
この例では、Oracle Identity Federationが実行されているアプリケーション・サーバーはOracle Single Sign-Onサーバーと統合されており、SSOモジュールは/engine/forward.jsp
URLを静的に保護しています。
また、Oracle Identity Federationに対して構成されているユーザー・データ・ストアは、Oracle Single Sign-Onで使用されるOracle Internet Directoryサーバーを参照します。
パッケージ化
認証エンジンは、ルート・コンテキストが/engine
に設定されたWebアプリケーションで構成され、次の2つのJSPページを含んでいます。
authentication.jsp
: Oracle Identity Federationサーバーからの受信リクエストを処理します。
forward.jsp
: Oracle Single Sign-Onで保護され、ユーザーを必須データとともにフェデレーション・サーバーに転送して戻します。
エンジンの追加
エンジンを追加するには、次の手順を実行します。
Fusion Middleware Controlで、Oracle Identity Federationインスタンスに移動します。
「管理」→「認証エンジン」の順に移動します。「認証エンジン」→「カスタム」タブを選択します。
認証エンジンを追加するには、「追加」をクリックして、認証エンジンの名前を入力します。Oracle Identity Federationにより、その新しいエンジンに対するIDが生成されます。このテストでは、このIDはTEST_ENGINE_IDとして参照します。
認証エンジンを選択して、次のように変更します。
エンジンを有効にします。
認証エンジンの「Webコンテキスト」を/engineに設定します。
認証エンジンの「ログイン相対パス」を/authentication.jspに設定します。
「適用」をクリックします。
authentication.jspの実装
<%@page buffer="5" autoFlush="true" session="false"%> <%@page language="java" import="java.net.*"%> <% response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "Thu, 29 Oct 1969 17:04:19 GMT"); String authnMech = (String)request.getAttribute("oracle.security.fed.authn.authnmech"); String refid = (String)request.getAttribute("oracle.security.fed.authn.refid"); String redirectURL = "/engine/forward.jsp?refid=" + (refid != null ? URLEncoder.encode(refid) : ""); response.sendRedirect(redirectURL); %>
forward.jspの実装
<%@page buffer="5" autoFlush="true" session="false"%> <%@page language="java" import="java.util.*"%> <% response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "Thu, 29 Oct 1969 17:04:19 GMT"); String refid = request.getParameter("refid"); String userID = request.getRemoteUser(); String authnMethod = "oracle:fed:authentication:password-protected"; Date now = new Date(); request.setAttribute("oracle.security.fed.authn.engineid", TEST_ENGINE_ID); request.setAttribute("oracle.security.fed.authn.userid", userID); request.setAttribute("oracle.security.fed.authn.refid", refid); request.setAttribute("oracle.security.fed.authn.authnmech", authnMethod); request.setAttribute("oracle.security.fed.authn.authntime", now); request.getSession().getServletContext().getContext("/fed").getRequestDispatcher("/user/loginsso").forward(request, response); %>
Oracle Single Sign-OnフレームワークではユーザーのブラウザでCookieを設定するため、認証エンジンをログアウト・フローと統合する必要があります(第10.5項「ログアウト」を参照)。
この項では、カスタマイズされた認証エンジンをスタンドアロンLDAPサーバーと統合する方法を示します。
設定
Fusion Middleware ControlでOracle Identity Federationに対して構成されているユーザー・データ・ストアは、認証エンジンで使用されるLDAPサーバーを参照します。
パッケージ化
認証エンジンは、ルート・コンテキストが/engine
に設定されたWebアプリケーションで構成され、次の2つのJSPページを含んでいます。
loginpage.jsp
: フェデレーション・サーバーからの受信リクエストを処理し、ログイン・ページを表示します。
ldapforward.jsp
: ユーザーの資格証明をLDAPサーバーに対して認証し、認証成功時にユーザーをフェデレーション・サーバーに転送します。
エンジンの追加
エンジンを追加するには、次の手順を実行します。
Fusion Middleware Controlで、Oracle Identity Federationインスタンスに移動します。
「管理」→「認証エンジン」の順に移動します。「認証エンジン」→「カスタム」タブを選択します。
認証エンジンを追加するには、「追加」をクリックして、認証エンジンの名前を入力します。Oracle Identity Federationにより、その新しいエンジンに対するIDが生成されます。このテストでは、このIDはTEST_ENGINE_ID
として参照します。
認証エンジンを選択して、次のように変更します。
エンジンを有効にします。
認証エンジンの「Webコンテキスト」を/engine
に設定します。
認証エンジンの「ログイン相対パス」を/loginpage.jsp
に設定します。
変更を保存します。
loginpage.jspの実装
<%@page buffer="5" autoFlush="true" session="false"%> <%@page language="java" import="java.net.*"%> <% response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "Thu, 29 Oct 1969 17:04:19 GMT"); String refid = request. getAttribute("oracle.security.fed.authn.refid"); String postURL = "/engine/ldapforward.jsp?refid=" + (refid != null ? URLEncoder.encode(refid) : ""); String msg = request.getParameter("message"); %> <HTML> <BODY> <FORM action="<%=postURL%>" method="POST"> <% if(msg != null && msg.length() > 0) { %> <%=msg%><BR/> <%}%> Username: <INPUT type="text" name="username"/><BR/> Password: <INPUT type="password" name="password"/><BR/> <INPUT type="submit" value="Submit"/> </FORM> </BODY> </HTML>
forward.jspの実装
<%@page buffer="5" autoFlush="true" session="false"%> <%@page language="java" import="java.util.*, javax.naming.*, javax.naming.directory.*, java.net.*"%> <% response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "Thu, 29 Oct 1969 17:04:19 GMT"); String refid = request.getParameter("refid"); String authnMethod = "oracle:fed:authentication:password-protected"; String userID = request.getParameter("username"); String password = request.getParameter("password"); Date now = new Date(); Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://mynode.us.mycorp.com:389"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "cn=" + userID + ",cn=users,dc=us,dc=oracle,dc=com"); env.put(Context.SECURITY_CREDENTIALS, password); try { DirContext ctx = new InitialDirContext(env); } catch (NamingException ex) { String redirectURL = "/engine/loginpage.jsp?refid=" + (refid != null ? URLEncoder.encode(refid) : "") + "&message=" + URLEncoder.encode(ex.toString() + " for " + userID); response.sendRedirect(redirectURL); return; } request.setAttribute("oracle.security.fed.authn.engineid", TEST_ENGINE_ID); request.setAttribute("oracle.security.fed.authn.userid", userID); request.setAttribute("oracle.security.fed.authn.refid", refid); request.setAttribute("oracle.security.fed.authn.authnmech", authnMethod); request.setAttribute("oracle.security.fed.authn.authntime", now); request.getSession().getServletContext().getContext("/fed").getRequestDispatcher("/user/loginsso").forward(request, response); %>
Logout
このフローではCookieは設定されないため、認証エンジンをログアウト・フローと統合する必要はありません(第10.5項「ログアウト」を参照)。
この項では、カスタムSP統合エンジンを計画、開発および実装する方法を説明します。
カスタムSP統合エンジンの開発には、次の手順が含まれます。
Oracle Identity FederationからのリクエストをSPモードで処理するサービスの作成。
ユーザー用の認証済セッションをIAMサーバーで作成するモジュールの実装。
最終のターゲットURLへのユーザーのリダイレクト。
SP統合エンジンがIAMサーバーでの認証済セッションの作成後にCookieを設定するかどうかの判断。設定する場合、エンジンをログアウト処理と統合する必要があります(第10.5項「ログアウト」を参照)。
前述のサービスおよびモジュールのWebアプリケーションへのパッケージ化と、フェデレーション・サーバーが実行されているOracle WebLogic管理対象サーバーへのこのアプリケーションのデプロイ。
Oracle Identity Federationが新しいSP統合モジュールを参照するようにするための構成。
SP統合エンジンがユーザー・リポジトリにアクセスする場合、それが、Oracle Identity Federationで使用されるようにFusion Middleware Controlで構成されているユーザー・データ・ストアと同じであることの確認。
この項では、統合モジュールを開発する方法と、フェデレーション環境に実装する方法を説明します。
Oracle Identity FederationエンジンとSP統合エンジンの間の通信では、APIコールに相当する内部サーブレット転送が必要です。これらの転送は、次のJavaEE APIを使用して実現されます。
ServletContext.getContext(String contextPath) .getRequestDispatcher(String relativePath) .forward(HttpServletRequest request, HttpServletResponse response)
ここで
contextPath
は、Webアプリケーションのルート・コンテキスト・パスです。たとえば、Oracle Identity FederationのcontextPath
は/fed
です。
relativePath
は、ユーザーの転送先となるサービスURLであり、contextPath
に相対的です。たとえば、フェデレーションSSOフローを開始する際、SP統合エンジンはユーザーの転送時に/sp/startsso
をrelativePathとして使用します。
Oracle Identity Federationは、新しいSP統合エンジンのIDおよびcontextPath
とrelativePath
を把握する必要があります。これは、フェデレーション・サーバーによって着信アサーションが処理された後にフェデレーションSSO処理の結果を処理するURLです。
SP統合エンジンを追加または変更するには、次の手順を実行します。
Fusion Middleware Controlで、Oracle Identity Federationインスタンスに移動します。
「管理」→「SP統合モジュール」に移動します。「カスタムSPエンジン」タブをクリックします。
SP統合エンジンを追加するには、「追加」をクリックして、SP統合エンジンの名前を入力します。Oracle Identity Federationにより、新しいエンジンに対するIDが生成されます。
注意: Fusion Middleware Controlでは、名前は表示目的でのみ使用し、Oracle Identity Federationと認証エンジン間の通信ではIDを使用します。 |
SP統合エンジンを変更するには、エンジンを選択して、次の操作を実行します。
エンジンを有効または無効にします。
「Webコンテキスト」フィールドで、SP統合エンジンのcontextPath
を指定します。
「ログイン相対パス」フィールドに、SP統合エンジンのログイン・サービスの相対パスを指定します。
アサーション処理中にローカル認証手順を実行する必要がある場合に使用する認証メカニズムを選択します(これは、ユーザー・レコードへのアサーションのマップにフェデレーテッドIDが使用されている場合にフェデレーション・レコードが存在しないときに発生します。この場合、レコードを作成する1回かぎりの操作を実行するために、ユーザーをローカルに認証する必要があります)。
ログアウトを有効または無効にします。
「ログアウト相対パス」フィールドに、SP統合エンジンのログアウト・サービスの相対パスを指定します。
変更を保存します。
Oracle Identity Federationからリクエストを受信した後、SP統合エンジンは次の機能を実行する必要があります。
ユーザー用の認証済セッションの作成
最終のURLへのユーザーのリダイレクト
SP統合モジュールにより設定される属性
フェデレーションSSO処理を開始するには、SP統合モジュールは次のデータをHttpServletRequest
属性として指定することにより、ユーザーをOracle Identity Federationに転送する必要があります。
認証中に使用するようにIdPにリクエストする認証メカニズムをSPに対して指定する、オプションの認証メカニズム。(oracle.security.fed.sp.authnmechで識別)。usedefaultがtrueであるか指定されていない場合は、このパラメータは無視されます。
注意: 設定された場合は、次に説明するように、このパラメータは使用すべきIdPを決定するために使用されます。この場合、usedefaultパラメータは無視されます。 |
フェデレーションSSOで使用するIdPを参照する、オプションのプロバイダID。指定されていない場合、Oracle Identity Federationは指定された認証メカニズムにマップされたIdPを使用します。IdPが見つからなかった場合は、Oracle Identity FederationはデフォルトSSO IdPとして構成されているIdPを使用します。この値はString
です(oracle.security.fed.sp.providerid
で識別)。
フェデレーションSSOのトリガーに使用するアフィリエーションを参照する、オプションのフェデレーションID(String、oracle.security.fed.sp.federationid
で識別)。
リレー状態。リポジトリに保存されたデータへの参照などの短い文字列、またはSSO処理の完了後にユーザーをリダイレクトする保護リソースを指す短いURLを含む場合があります。(oracle.security.fed.sp.relaystate
で識別)。
SSOフローを開始したSPエンジンの識別子(String
、oracle.security.fed.sp.engineid
で識別)。
Oracle Identity Federationサーバーが認証エンジンを使用してユーザーをローカルに認証すべきか、またはユーザーを認証用にIdPにリダイレクトしてフェデレーションSSOを開始すべきかを示す、オプションのboolean
(Boolean
、oracle.security.fed.sp.localauthn
で識別。デフォルトはfalse
)。
Oracle Identity Federationに格納されている構成を使用すべきか、またはSPエンジンによって渡された、IdP以外の情報に基づいてSSO処理のみを開始すべきかを示す、Boolean
オブジェクト(oracle.security.fed.sp.usedefault
で識別)。指定されていない場合、true
とみなされます。
ユーザーが認証済の場合にもユーザーをチャレンジするようにSPがIdPに指示すべきかを示す、Boolean
オブジェクト(oracle.security.fed.sp.forceauthn
で識別)。usedefaultがtrueであるか指定されていない場合は、このパラメータは無視されます。
SSO処理中に、フェデレーション・レコードがまだ存在しない場合はレコードを作成することをSPがIdPに対して許可すべきかを示す、Boolean
オブジェクト(oracle.security.fed.sp.allowfedcreation
で識別)。usedefaultがtrueであるか指定されていない場合は、このパラメータは無視されます。
SSO処理中にユーザーと対話しないようにSPがIdPに指示すべきかを示す、Boolean
オブジェクト(oracle.security.fed.sp.passive
で識別)。usedefaultがtrueであるか指定されていない場合は、このパラメータは無視されます。
AuthnRequestの送信時に使用するバインディングを表すString
(oracle.security.fed.sp.requestbinding
で識別)。usedefaultがtrueであるか指定されていない場合は、このパラメータは無視されます。許容される値は、プロトコルに応じて、httpredirect
、httpost
またはhttppostsimple
になります。
アサーションを含むレスポンスの送信時に使用するバインディングを表すString
(oracle.security.fed.sp.responsebinding
で識別)。usedefault
がtrueであるか指定されていない場合は、このパラメータは無視されます。許容される値は、プロトコルに応じて、artifact
またはhttpost
になります。
認証中に使用するようにIdPにリクエストする認証コンテキスト比較をSPに対して指定する、オプションの認証メカニズム比較(oracle.security.fed.sp.authnmechcomparison
で識別)。usedefault
がtrue
であるか指定されていない場合は、このパラメータは無視されます。
SSO処理に関してSPがIdPに問い合せる名前IDフォーマットを表すString
(oracle.security.fed.sp.nameidformat
で識別)。usedefault
がtrueであるか指定されていない場合は、このパラメータは無視されます。
フェデレーションSSO処理中に、アイデンティティ・プロバイダに対してリクエストするオプションの属性(たとえばOpenID IdPとの対話時に)。データは、キーとしてString
を、値としてオブジェクトのセットを使用するMap
として渡されます(oracle.security.fed.sp.attributes
で識別)。値はオプションですが、キーには属性名が含まれます。
Oracle Identity Federationのアサーション処理
次にOracle Identity Federationは、リモートIdPとのSAML/WS-Fed SSO処理を実行し、アサーションを処理し、オプションでローカル・ユーザー・レコードにアサーションをマップし、最後に次の情報をHttpServletRequest
属性として指定することにより、処理を開始したSP統合エンジンにユーザーを転送して戻します。
SSO処理が成功したかどうかを示すBoolean
オブジェクト(oracle.security.fed.sp.authnresult
で識別)
ユーザーの識別子(String、oracle.security.fed.sp.useridで識別)
認証時刻(Date
オブジェクト、oracle.security.fed.sp.authntime
で識別)
認証済セッションの有効期限(Date
オブジェクト、oracle.security.fed.sp.expirationtime
で識別)
ユーザーを識別するために使用する認証メカニズム(String
、oracle.security.fed.sp.authnmech
で識別)
リレー状態(String
、oracle.security.fed.sp.relaystateで識別)
アサーションの内容: 名前ID、アサーションの発行者およびオプションの属性。注意: アサーションの内容はXMLデータとしては渡されません。つまり、元のアサーションはモジュールには戻されません。データは、キーとしてString
を、値としてオブジェクトのセットを使用するMapとして渡されます(
oracle.security.fed.sp.attributes
で識別)。追加のデータは次のように参照されます。
名前ID値を含むorafed-nameid-value
名前ID修飾子を含むorafed-nameid-qualifier
名前IDフォーマットを含むorafed-nameid-format
ピア・プロバイダIDを含むorafed-providerid
orafed-assertionid
- アサーションのID
orafed-xmlmessage
- アサーションを含むオプションのXMLメッセージ
詳細は、第6.13.2項「SSO完了後のSPエンジンへのXMLメッセージの送信」を参照してください。
SAMLレスポンスの最高ステータス(String、oracle.security.fed.sp.topstatus
で識別)
SAMLレスポンスの低ステータス(存在する場合)(String、oracle.security.fed.sp.lowstatus
で識別)
ステータス・メッセージ(存在する場合)(String、oracle.security.fed.sp.statusmessage
で識別)
SSOアサーションを作成したプロバイダID(String、oracle.security.fed.sp.providerid
で識別)
前述の情報を処理するSPエンジンの識別子(oracle.security.fed.sp.engineid
で識別)
ユーザー・セッションのOracle Identity Federation識別子を含むString。Oracle Identity Federationは、SPエンジンがユーザーにリンクされた状態を維持できるように、ユーザー・セッションのセッションIDを渡します。またOracle Identity Federationは、セッションID値を使用してそのデータを参照できます。後でログアウト・フローが実行される際に、このユーザー・セッションで使用されたデータをエンジンが削除できるように、Oracle Identity FederationはログアウトするセッションIDをエンジンに渡します。(oracle.security.fed.sessionid
で識別)。
認証済セッションの作成
これらのデータを使用して、SP統合エンジンは、認証済セッションを作成し、ユーザーを最終のターゲットURLにリダイレクトします。
サービスでCookieを設定する必要がある場合は、Cookieのパスを/に設定します。これは、Oracle Identity FederationのWebアプリケーションとSP統合エンジンのWebアプリケーション間の内部転送のために必要です。ユーザーのブラウザは、フェデレーション・サーバーにのみアクセスする場合にも、SP統合エンジンに関連するCookieを送信する必要があります。これにより、フェデレーション・サーバーからSP統合エンジンへの内部転送時に、エンジンによって設定されたCookieがHTTPリクエストで使用可能になります。
次の2つの項では、カスタム認証エンジンの実装例を示します。
サンプルの統合モジュール1: Oracle WebLogic Server JavaEE統合
サンプルの統合モジュール2: カスタム・シングル・サインオン統合
注意: この後でサンプルの統合モジュール1および2として説明されているカスタム統合および認証用以外のアプリケーションをOracle WebLogic管理対象サーバーにデプロイすると、セキュリティ上のリスクが発生する可能性があるため、そのようなデプロイは行わないことをお薦めします。無関係なアプリケーションをOracle WebLogic管理対象サーバーにデプロイしたすると、悪意のあるソフトウェアによってサーバー・フローの動作が変更される可能性があるため、フェデレーション・サーバーのセキュリティに悪影響を及ぼすことがあります。 |
この項では、javax.servlet.http.HttpSession
を使用して属性を設定する単純なSP統合エンジンを示します。この属性の存在により、ユーザーを認証するかどうかが決まります。
注意: この項の例は、説明のみを目的としているため、本番環境では使用しないでください。この例では、Oracle WebLogic管理対象サーバーにデプロイされている他のアプリケーションがSP統合エンジンで設定されるデータを使用すると想定していますが、このようなアプローチは使用しないことをお薦めします。さらに、この例は、特定のデプロイメント、特にHttpSession を複数のJ2EEアプリケーションに伝播しているデプロイメントでは、正しく機能しない場合があります。 |
設定
SP統合エンジンは、Oracle Identity Federationで使用されるユーザー・データ・ストアとは相互作用しません。
パッケージ化
SP統合エンジンは、ルート・コンテキストが/engine
に設定されたWebアプリケーションで構成され、次の2つのJSPページを含んでいます。
wlsintegration.jsp
: フェデレーション・サーバーからのリクエストを処理し、ユーザー識別子が含まれるfeduserid
属性を使用してHttpSessionを作成します。
application.jsp
: アプリケーションとして機能します。HttpSession
のfeduserid
属性を検索し、属性が見つからない場合はフェデレーションSSOをトリガーします。
SP統合エンジンの追加または変更
SP統合エンジンを追加または変更するには、次の手順を実行します。
Fusion Middleware Controlで、Oracle Identity Federationインスタンスに移動します。
「管理」→「SP統合モジュール」に移動します。「カスタムSPエンジン」タブをクリックします。
SP統合エンジンを追加するには、「追加」をクリックして、SP統合エンジンの名前を入力します。Oracle Identity Federationにより、その新しいエンジンに対するIDが生成されます。このテストでは、このIDはTEST_ENGINE_ID
として参照します。
SP統合エンジンを変更するには、エンジンを選択して、次の操作を実行します。
エンジンを有効にします。
認証エンジンの「Webコンテキスト」を/engine
に設定します。
SP統合エンジンの「ログイン相対パス」を/wlsintegration.jsp
に設定します。
アサーション処理中にローカル認証手順を実行する必要がある場合に使用する認証メカニズムを選択します(これは、ユーザー・レコードへのアサーションのマップにフェデレーテッドIDが使用されている場合にフェデレーション・レコードが存在しないときに発生します。この場合、レコードを作成する1回かぎりの操作を実行するために、ユーザーをローカルに認証する必要があります)。
変更を保存します。
application.jspの実装
<%@page buffer="5" autoFlush="true" session="false"%> <%@page language="java" import="java.net.*"%> <% response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "Thu, 29 Oct 1969 17:04:19 GMT"); String userid = (String)request.getSession().getAttribute("feduserid"); if (userid == null || userid.length() == 0) { request.setAttribute("oracle.security.fed.sp.engineid", TEST_ENGINE_ID); request.setAttribute("oracle.security.fed.sp.usedefault", Boolean.TRUE); request.setAttribute("oracle.security.fed.sp.relaystate", "/engine/application.jsp"); request.getSession().getServletContext().getContext("/fed").getRequestDispatcher("/sp/startsso").forward(request, response); return; } %> Welcome <%=userid%>
wlsintegration.jspの実装
<%@page buffer="5" autoFlush="true" session="false"%> <%@page language="java" import="java.util.*"%> <% response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "Thu, 29 Oct 1969 17:04:19 GMT"); String userid = (String)request.getAttribute("oracle.security.fed.sp.userid"); String targetURL = (String)request.getAttribute("oracle.security.fed.sp.relaystate"); request.getSession().setAttribute("feduserid", userid); response.sendRedirect(targetURL); %>
Logout
このアプリケーションではOracle WebLogic管理対象サーバー・インスタンスでHttpSessionを設定するため、SP統合エンジンをログアウト・フローと統合する必要があります(第10.5項「ログアウト」を参照)。
この項で示すSP統合エンジンでは、ユーザー名および認証済セッションの有効期限が含まれているCookieに基づく単純なシングル・サインオン・フレームワークを使用します。
注意: この例は、説明のみを目的としているため、本番環境では使用しないでください。たとえば、この例で設定されるCookieは暗号化されないため、攻撃者がこのようなCookieを手動で構成することで、ユーザーのなりすましが可能になります。 |
設定
SP統合エンジンは、Oracle Identity Federationで使用されるユーザー・データ・ストアとは相互作用しません。このエンジンは、String
変数のユーザー識別子とlong変数のセッション・タイムアウトが含まれるCookieをドメイン全体に対して設定します。
パッケージ化
SP統合エンジンは、ルート・コンテキストが/engine
に設定されたWebアプリケーションで構成され、次の2つのJSPページを含んでいます。
domainintegration.jsp
: Oracle Identity Federationサーバーからのリクエストを処理し、ユーザーIDおよびセッション・タイムアウトを含むCookieを作成します。
domainapplication.jsp
: アプリケーションとして機能します。Cookieを検索し、Cookieが見つからない場合はフェデレーションSSOをトリガーします。
SP統合エンジンの追加または変更
SP統合エンジンを追加または変更するには、次の手順を実行します。
Fusion Middleware Controlで、Oracle Identity Federationインスタンスに移動します。
「管理」→「SP統合モジュール」に移動します。「カスタムSPエンジン」タブをクリックします。
SP統合エンジンを追加するには、「追加」をクリックして、SP統合エンジンの名前を入力します。Oracle Identity Federationにより、その新しいエンジンに対するIDが生成されます。このテストでは、このIDはTEST_ENGINE_IDとして参照します。
SP統合エンジンを変更するには、エンジンを選択して、次の操作を実行します。
エンジンを有効にします。
認証エンジンの「Webコンテキスト」を/engineに設定します。
SP統合エンジンの「ログイン相対パス」を/domainintegration.jspに設定します。
アサーション処理中にローカル認証手順を実行する必要がある場合に使用する認証メカニズムを選択します(これは、ユーザー・レコードへのアサーションのマップにフェデレーテッドIDが使用されている場合にフェデレーション・レコードが存在しないときに発生します。この場合、レコードを作成する1回かぎりの操作を実行するために、ユーザーをローカルに認証する必要があります)。
変更を保存します。
domainapplication.jspの実装
<%@page buffer="5" autoFlush="true" session="false"%> <%@page language="java" import="java.net.*, java.util.*"%> <% response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "Thu, 29 Oct 1969 17:04:19 GMT"); Cookie[] cookies = request.getCookies(); String userid = null; Date timeout = null; for(int i = 0, size = (cookies != null ? cookies.length : 0); i < size; i++) { String name = cookies[i].getName(); if ("spintegrationcookie".equals(name)){ String value = cookies[i].getValue(); StringTokenizer st = new StringTokenizer(value, "*"); userid = st.nextToken(); timeout = new Date(Long.parseLong(st.nextToken())); break; } } if (userid == null || userid.length() == 0) { request.setAttribute("oracle.security.fed.sp.engineid", TEST_ENGINE_ID); request.setAttribute("oracle.security.fed.sp.usedefault", Boolean.TRUE); request.setAttribute("oracle.security.fed.sp.relaystate", "/engine/domainapplication.jsp"); request.getSession().getServletContext().getContext("/fed").getRequestDispatcher("/sp/startsso").forward(request, response); return; } %> Welcome <%=userid%>. You are logged until <%=timeout%>
domainintegration.jspの実装
<%@page buffer="5" autoFlush="true" session="false"%> <%@page language="java" import="java.util.*"%> <% response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "Thu, 29 Oct 1969 17:04:19 GMT"); String userid = (String)request.getAttribute("oracle.security.fed.sp.userid"); String targetURL = (String)request.getAttribute("oracle.security.fed.sp.relaystate"); Date expirationInst = (Date)request.getAttribute("oracle.security.fed.sp.expirationtime"); String cookieValue = userid + "*" + expirationInst.getTime(); Cookie cookie = new Cookie("spintegrationcookie", cookieValue); cookie.setDomain(".us.example.com"); cookie.setPath("/"); response.addCookie(cookie); response.sendRedirect(targetURL); %>
Logout
このサンプルのアプリケーションではドメインCookieを設定するため、SP統合エンジンをログアウト・フローと統合する必要があります(第10.5項「ログアウト」を参照)。
この項では、ログアウト・フローを構成する方法を説明します。
この項には、ログアウト中のリダイレクションに関連する内容が含まれます。
URL
ユーザーは、ログアウト操作中に、フェデレーション・エンジンと、認証およびSP統合エンジンのログアウト・サービスとの間でリダイレクトされます。
Oracle Identity Federationは、ユーザーをサーブレット/jspページにリダイレクトしてログアウトするために、ログアウト・サービスの場所を認識している必要があります。このURLは、認証エンジンおよびSP統合エンジンのログアウト場所フィールドで定義します。URLは、エンジンのWebコンテキストとログアウト相対パスを組み合せたものとして定義できます。
ログアウト・サービスの実装
ログアウト・サービスでは、次の操作を実行する必要があります。
フェデレーション・エンジンからのリクエストを処理し、ユーザーをIAMフレームワークからログアウトさせ、ユーザーをOracle Identity Federationに送り返します。
IAMフレームワークからのリクエストを処理し、ユーザーをログアウトさせるためにOracle Identity Federationに送信し、ログアウト後にユーザーをOracle Identity Federationから受け取り、ユーザーをIAMフレームワークに送信します。
Oracle Identity Federationによる認証エンジンまたはSPエンジンの呼出し
Oracle Identity Federationは、ユーザーを認証エンジンまたはSPエンジンに送信する際に、次の処理を実行します。
エンジンのWebコンテキストおよび相対ログアウト・パスへの内部転送を実行します。
oracle.security.fed.authn.engineid
(エンジンが認証エンジンの場合)またはoracle.security.fed.sp.engineid(エンジンがSPエンジンの場合)で参照されるHttpServletRequestの属性に、呼び出すエンジンのエンジンIDを指定します。
オプションで、oracle.security.fed.sessionid
で参照され、ログアウト対象のユーザー・セッションの識別子(String
オブジェクト)を格納する属性をHttpServletRequest
で指定します。
認証エンジンまたはSPエンジンによるユーザーのログアウト時に、エンジンはユーザーをOracle Identity Federationに内部的に転送して戻し、次の処理を実行します。
/fed
Webコンテキストおよび/user/logoutretsso
への内部転送を実行します。
oracle.security.fed.authn.engineid
(エンジンが認証エンジンの場合)またはoracle.security.fed.sp.engineid
(エンジンがSPエンジンの場合)で参照されるHttpServletRequest
の属性に、呼び出されたエンジンのエンジンIDを指定します。この属性値は、ログアウト処理を実行したエンジンの識別子です。
認証エンジンまたはSPエンジンによるOracle Identity Federationの呼出し
認証エンジンまたはSPエンジンは、ログアウト時にOracle Identity Federationを呼び出す場合、次の処理を実行します。
/fed
Webコンテキストおよび/user/logoutsso
への内部転送を実行します。
oracle.security.fed.authn.engineid
(エンジンが認証エンジンの場合)またはoracle.security.fed.sp.engineid
(エンジンがSPエンジンの場合)で参照されるHttpServletRequest
の属性に、呼び出すエンジンのエンジンIDを指定します。この属性値は、ログアウト用に呼び出すエンジンの識別子です。
Oracle Identity Federationがログアウト後にユーザーをリダイレクトする戻りURLを指定します。このURLは、oracle.security.fed.logout.returnurl
で参照されるHttpServletRequest
の属性で指定します。
ログアウト・フローの最後に、ユーザーはOracle Identity Federationからログアウトされ、戻りURLにリダイレクトされます。
次の2つの項では、ログアウト・サービスの次の使用例を概説します。
ログアウト・サービス例1では、認証エンジンとSP統合エンジンの両方がカスタマイズされている場合のカスタム・ログアウト・サービスについて説明します。
ログアウト・サービス例2では、SP統合エンジンのみがカスタマイズされている場合のカスタム・ログアウト・サービスについて説明します。
この項では、認証エンジンとSP統合エンジンの両方がカスタマイズされている場合、つまりデフォルト・エンジンが使用されていない場合に、カスタム・ログアウト・サービスを統合する方法を説明します。
設定
この例では、認証エンジンは第10.3項「カスタム認証エンジンの作成」で説明したLDAPエンジンであり、SP統合エンジンは第10.4.4項「サンプルの統合モジュール1: Oracle WebLogic Server JavaEEコンテナ統合」で説明したOracle WebLogic Server統合エンジンです。
パッケージ化
ログアウト・サービスは、認証およびSP統合エンジンとバンドルされている次のJSPページで構成されています。
logout.jsp
: Oracle Identity Federationからのリクエストを処理し、wlsintegration.jsp
ページで設定されているHttpSessionオブジェクトからfeduserid
属性を削除し、ユーザーをOracle Identity FederationまたはdoneURL
パラメータにリダイレクトします。
エンジンの更新
エンジンを更新するには、次の手順を実行します。
Fusion Middleware Controlで、Oracle Identity Federationインスタンスに移動します。
「管理」→「SP統合モジュール」に移動します。「カスタムSPエンジン」タブをクリックします。
SP統合エンジンを変更するには、エンジンを選択して、次の操作を実行します。
ログアウト・エンジンを有効にします。
SP統合エンジンの「ログアウト相対パス」を/logout.jspに設定します。
変更を保存します。
logout.jspの実装
<%@page buffer="5" autoFlush="true" session="false"%> <%@page language="java" import="java.net.*"%> <% response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "Thu, 29 Oct 1969 17:04:19 GMT"); request.getSession().removeAttribute("feduserid"); request.setAttribute("oracle.security.fed.sp.engineid", TEST_ENGINE_ID); request.getSession().getServletContext().getContext("/fed").getRequestDispatcher("/user/logoutretsso").forward(request, response); %>
この項では、SP統合エンジンがカスタマイズされている場合に、カスタム・ログアウト・サービスを統合する方法を説明します。
設定
この例では、SP統合エンジンは、第10.4.5項「サンプルの統合モジュール2: カスタム・シングル・サインオン統合」で説明したカスタマイズされたSSO統合エンジンです。
パッケージ化
ログアウト・サービスは、認証およびSP統合エンジンとバンドルされている次のJSPページで構成されています。
domainlogout.jsp
: Oracle Identity Federationからのリクエストを処理し、Cookieを削除し、ユーザーを/logoutretsso
URLにリダイレクトします。
エンジンの更新
エンジンを更新するには、次の手順を実行します。
Fusion Middleware Controlで、Oracle Identity Federationインスタンスに移動します。
「管理」→「SP統合モジュール」に移動します。
SP統合エンジンを変更するには、エンジンを選択して、次の操作を実行します。
ログアウト・エンジンを有効にします。
SP統合エンジンの「ログアウト相対パス」
を/domainlogout.jspに設定します。
変更を保存します。
domainlogout.jspの実装
<%@page buffer="5" autoFlush="true" session="false"%> <%@page language="java" import="java.net.*"%> <% response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "Thu, 29 Oct 1969 17:04:19 GMT"); Cookie cookie = new Cookie("spintegrationcookie", ""); cookie.setDomain(".us.example.com"); cookie.setPath("/"); cookie.setMaxAge(0); response.addCookie(cookie); request.setAttribute("oracle.security.fed.sp.engineid", TEST_ENGINE_ID); request.getSession().getServletContext().getContext("/fed").getRequestDispatcher("/user/logoutretsso").forward(request, response); %>