ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Identity Federation管理者ガイド
11g リリース1(11.1.1)
B66693-02
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

10 サード・パーティのIDおよびアクセス管理モジュールとの統合

この項には、カスタム・エンジンの実装に関連する次の内容が含まれています。

10.1 カスタム実装のためのバックグラウンド情報

デフォルトでは、Oracle Identity Federationは、Oracle Access Manager、Oracle AS Single Sign-Onなどの複数のIDおよびアクセス管理(IAM)製品と統合されます。詳細は、第5.15項「認証エンジンの構成」および第5.16項「SP統合モジュールの構成」を参照してください。


関連項目:

Oracle Identity Federationの解説と、他のフェデレーション・コンポーネントとの関係の詳細は、第1.2.2項「アーキテクチャ」を参照してください。


この項では、カスタムIAM製品に対するフレームワークのコンポーネントについて説明し、カスタムIAMソリューションを構成してこのフレームワークに統合する方法を示します。


注意:

この項で説明されているカスタム統合および認証用以外のアプリケーションをOracle WebLogic管理対象サーバーにデプロイすると、セキュリティ上のリスクが発生する可能性があるため、そのようなデプロイは行わないことをお薦めします。無関係なアプリケーションをOracle WebLogic管理対象サーバーにデプロイしたすると、悪意のあるソフトウェアによってサーバー・フローの動作が変更される可能性があるため、フェデレーション・サーバーのセキュリティに悪影響を及ぼすことがあります。


10.2 アーキテクチャおよびフロー

実行時に、Oracle Identity Federationは2種類の外部モジュール(ユーザー・データ・ストアと、IDおよびアクセス管理(IAM)システム)と相互作用します。

Oracle Identity Federationがユーザー・データ・ストアと連携する目的は次のとおりです。

IDおよびアクセス管理(IAM)システムは、保護されたリソースに対するアクセスを制御します。Oracle Identity Federationがフェデレーション・サーバーとしてIAMと相互作用する目的は次のとおりです。

10.2.1 アーキテクチャ

図3-1に、Oracle Identity Federationデプロイメントの複数の外部および内部モジュールと、各モジュールが実行時に相互作用する方法を示します。

図10-1 Oracle Identity Federationモジュールの相互作用

図10-1については周囲のテキストで説明しています。

ここでは、わかりやすいように、Oracle Identity Federationを次の3つの内部モジュールとして示します。

  • アイデンティティ・フェデレーション・エンジン。AuthnRequest、アサーションおよびログアウトなどのSAMLメッセージの作成および処理を行います。

    このモジュールの機能は次のとおりです。

    • SAMLメッセージの処理時に、ユーザー・データ・ストアと連携します。

    • ユーザーをローカルに識別する必要がある場合に、認証エンジンと相互作用します。

    • アサーションの処理後にユーザーがIAMコンポーネントにリダイレクトされる際に、SP統合エンジンと相互作用します。

  • 認証エンジン。フェデレーション・エンジンからのリクエストを処理してユーザーを認証します。このモジュールはIAMコンポーネントおよびユーザー・データ・ストアと相互作用して、ユーザーの認証と、Oracle Identity Federationでユーザーの参照に使用される一意の識別子の取得を実行します。

    このモジュールは、ローカル認証が必要な場合に、IdPまたはSPモードで起動できます。

    ユーザーの認証後、認証エンジンは、ユーザー識別子や認証時刻およびその他のデータなどの認証情報をフェデレーション・エンジンに送信します。

  • フェデレーション・エンジンは、着信SAMLアサーションを正常に処理し、アサーションで参照されるユーザーを検索した後、そのユーザー用の認証済セッションをIAMドメインで作成するようにSP統合エンジンに指示します。必要な情報(ユーザー識別子、認証時刻など)をSP統合エンジンに渡します。SP統合エンジンは、IAMサーバーと相互作用してこのセッションを作成します。

10.2.2 認証エンジン・フレームワーク

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はフェデレーション・サーバーとも呼ばれます)。

  1. ユーザーがOracle Identity FederationにアクセスしてSSO処理を行います(SPまたはIdPモード)。

  2. サーバー内の内部プロセスが、特定の認証メカニズム(構成で指定されたデフォルトのメカニズムまたはリモート・サービス・プロバイダによってリクエストされたメカニズム)を使用してユーザーを識別する必要があることを判断します。

  3. フェデレーション・サーバーが、指定された認証メカニズムに対して、ユーザーをチャレンジ/識別するために使用する認証エンジンを決定します。

  4. 次に、フェデレーション・サーバーはユーザーをチャレンジ/識別する認証エンジンの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をエンジンに渡します。

  5. 認証エンジンが受信リクエストを処理します。認証エンジンは、HttpServletRequest属性として格納されている情報にアクセスできます。

  6. 認証エンジンは、IAMコンポーネントと相互作用し、ユーザーの資格証明を要求する場合があります。認証に成功すると、Cookieを設定する場合があります(IAMサーバーまたはターゲット・アプリケーション、あるいはその両方との認証済セッションを維持するためなど)。

  7. 認証モジュールは内部転送(Webコンテキスト/fedおよびログイン相対パス/user/loginsso)を使用してユーザーをOracle Identity Federationに戻し、次の情報をHttpServletRequest属性として渡します。

    • ユーザーの識別子。

    • 認証時刻

    • 認証済セッションの有効期限

    • ユーザーの識別に使用した認証メカニズム

    • リクエストからの、実行されたアクションを参照する識別子

    • ユーザーの認証に使用するエンジンを参照する識別子。

    • オプションで、ユーザー・セッションに格納されている属性のマップ。

    • オプションで、Oracle Identity FederationがOracle Identity Federationユーザー・セッションの参照に使用する必要があるOracle Identity Federationのセッション識別子を含む文字列。これにより、エンジンとOracle Identity Federationは、同じ識別子を共有してユーザー・セッションを参照できます。後でログアウト・フローが実行される際に、このユーザー・セッションに使用されたデータをエンジンが削除できるように、Oracle Identity FederationはログアウトするsessionIDをエンジンに渡します。


    注意:

    • ユーザーID属性が空だが、認証時刻と認証メカニズム属性が空ではない場合、認証は成功したがサーバー上でユーザーが不明であることがOracle Identity Federationに通知されます。これはIdPの役割を果たすOracle Identity Federationが、エンジンによって渡された属性を使用してアサーションを作成するように構成されている場合に有用です。

    • 認証時刻または認証メカニズム属性が空の場合は、認証に失敗したことがOracle Identity Federationに通知されます。


  8. Oracle Identity Federationが次のアクションを実行します。

    • 受信リクエストの処理

    • 属性としてHttpServletRequestに埋め込まれたデータの取得

    • ユーザー・データ・ストアでのユーザーの検索

    • ユーザー用のセッションの作成

    • Cookieの設定

    • SSO処理の再開

10.2.3 SP統合エンジン・フレームワーク

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フレームワークと相互作用する方法を段階的に説明します。

  1. ユーザーが、IAMソリューションにより保護され、ユーザーの認証にフェデレーションSSOを使用するように構成されているリソースへのアクセスを試みます。

  2. IAMデプロイメントが、Oracle Identity Federation上の対応するSP統合モジュールにユーザーをリダイレクトします。

  3. 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

  4. Oracle Identity Federationが、リモートIdPとの間でフェデレーションSSO処理を開始します。

  5. IdPがユーザーを認証し、必要に応じてユーザーをアサーションとともに、SPとして機能するフェデレーション・サーバーにリダイレクトします。

  6. サーバーがアサーションを処理し、ユーザーをユーザー・データ・ストアで検索します。これで、ユーザーがフェデレーション・サーバーで認証されます。

  7. 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をエンジンに渡します。

  8. SP統合エンジンが、IAMサーバーと相互作用して、ユーザー用の認証済セッションを作成します。このセッションは、Oracle Identity Federationから受信されたデータに基づきます。

  9. SP統合エンジンが、ユーザーを最終のターゲットURLにリダイレクトします。

10.2.4 ログアウト

ログアウト時には、Oracle Identity Federationおよび認証またはSPエンジンからログアウトする必要があります。これには、次の操作が含まれます。

  1. 認証エンジンからユーザーをログアウトさせます。

  2. SPエンジンからユーザーをログアウトさせます。

  3. SAML/WS-Fedグローバル・ログアウト・プロファイルを実行します。

  4. Oracle Identity Federationからユーザーをログアウトさせます。

図10-2 Oracle Identity Federationモジュールの相互作用

図10-2については周囲のテキストで説明しています。

ログアウトを呼び出すにはいくつかの方法があります。

  • ユーザーがオプションの戻り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エンジンに送信する際に、次の処理を実行します。

  1. エンジンのWebコンテキストおよび相対ログアウト・パスへの内部転送を実行します。

  2. ログアウト時に呼び出すエンジンのエンジンIDを指定します。

  3. オプションで、ログアウトされるユーザー・セッションの識別子を指定します。

認証エンジンまたはSPエンジンによるユーザーのログアウト時に、エンジンはユーザーをOracle Identity Federationに内部的に転送して戻し、次の処理を実行します。

  1. /fed Webコンテキストおよび/user/logoutretssoへの内部転送を実行します。

  2. 呼び出すエンジンのエンジンIDを指定します。

認証エンジンまたはSPエンジンによるOracle Identity Federationの呼出し

認証エンジンまたはSPエンジンは、ログアウト時にOracle Identity Federationを呼び出す場合、次の処理を実行します。

  1. /fed Webコンテキストおよび/user/logoutssoへの内部転送を実行します。

  2. ログアウト時に呼び出すエンジンのエンジンIDを指定します。

  3. Oracle Identity Federationがログアウト後にユーザーをリダイレクトする戻りURLを指定します。

ログアウト・フローの最後に、ユーザーはOracle Identity Federationからログアウトされ、戻りURLにリダイレクトされます。

10.2.5 要件

Oracle Identity Federationは、認証操作およびSP統合に関する特定の要件を満たすよう設計されています(ユーザー・セッションがIAMサーバーで作成される場合)。したがって、カスタム認証エンジンまたはSP統合エンジンの実装時は次の要件を満たす必要があります。

  • 認証エンジン、SP統合エンジン、Oracle Identity FederationエンジンおよびIAMサーバーは、同じユーザー・データ・ストアをユーザー・リポジトリとして使用する必要があります。このストアには、ユーザーの検索および認証に使用されるユーザー・データが含まれています。

  • 認証エンジンおよびSP統合エンジンには、Javaサーブレット/JSPが含まれている必要があります。

  • Oracle Identity Federationと認証/SP統合エンジンの間のデータ交換は、内部HTTPリクエスト転送を介して行われる必要があります。これは実際には、J2EEサーブレット・フレームワークに依存したモジュール間の内部APIコールであり、HTTPプロトコルを介して行われます。

  • ログアウト・サービスを実装し、認証エンジンまたはSP統合エンジン(あるいはその両方)がこのサービスを使用できるようにする必要があります。このログアウト・サービスは、サーブレット/JSPとして公開される必要があります。

10.3 カスタム認証エンジンの作成

この項では、カスタム認証エンジンを計画、開発および実装する方法を説明します。

10.3.1 カスタム認証エンジンの計画

カスタマイズされた認証エンジンの作成には、次の手順が含まれます。

  • Oracle Identity Federationからの受信リクエストを処理するサービスの作成。

  • ユーザーを認証するモジュールの実装。

  • ユーザーを必須情報とともにフェデレーション・サーバーに転送するサービスの作成。

  • 認証エンジンがユーザーの認証後にCookieを設定するかどうかの判断。設定する場合、認証モジュールをログアウト処理と統合する必要があります(第10.5項「ログアウト」を参照)。

  • サービスおよびモジュールのWebアプリケーションへのパッケージ化と、Oracle Identity Federationが実行されているOracle WebLogic管理対象サーバーへのアプリケーションのデプロイ。

  • Oracle Identity Federationが新しい認証エンジンを参照するようにするための構成。

  • 認証エンジンによって返されるユーザー識別子が、Oracle Identity Federationユーザー・データ・ストア内の同じユーザーを参照することの確認。

10.3.2 認証モジュールの開発および実装

ここでは、モジュール開発のいくつかの側面について説明します。

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/loginssorelativePathとして使用します。

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では、内部転送の処理時に次のデータが必要です。

  • ユーザーの識別子(Stringoracle.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で識別)。


注意:

  • oracle.security.fed.authn.userid属性が空だが、oracle.security.fed.authn.authntimeoracle.security.fed.authn.authnmech属性が空ではない場合、認証は成功したがサーバー上でユーザーが不明であることをOracle Identity Federationに対して示します。これはIdPの役割を果たすOracle Identity Federationが、エンジンによって渡された属性を使用してアサーションを作成するように構成されている場合に有用です。

    oracle.security.fed.authn.userid属性がnullである場合、アサーション・データはカスタム認証エンジンから渡された情報のみに基づくため、IdPはフェデレーション・データ・ストアは使用しないように構成する必要があります。

  • XMLベースのフェデレーション・ストアはテストにのみ使用し、本番環境では使用しないでください。

  • oracle.security.fed.authn.authntimeまたはoracle.security.fed.authn.authnmech属性が空の場合は、認証が失敗したことをOracle Identity Federationに対して示します。


さらに、次の追加の実装要件があります。

  • サービスでCookieを設定する必要がある場合、ユーザーをフェデレーション・サーバーに転送する前にその操作を実行してください。

  • Cookieのパス値を/に設定します。これは、Oracle Identity FederationのWebアプリケーションと認証エンジンのWebアプリケーション間の内部転送のために必要です。ユーザーのブラウザは、フェデレーション・サーバーにのみアクセスする場合にも、認証エンジンに関連するCookieを送信する必要があります。これにより、フェデレーション・サーバーから認証エンジンへの内部転送時に、エンジンによって設定されたCookieがHTTPリクエストで使用可能になります。

10.3.3 Oracle Single Sign-On統合用のサンプルの認証モジュール

この項では、カスタム認証エンジンを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サーバーを参照します。


関連項目:

SSO統合の詳細は、第3.2.2項「Oracle Single Sign-OnとのOracle Identity Federationのデプロイ」を参照してください。


パッケージ化

認証エンジンは、ルート・コンテキストが/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項「ログアウト」を参照)。

10.3.4 LDAP統合用のサンプルの認証モジュール

この項では、カスタマイズされた認証エンジンをスタンドアロンLDAPサーバーと統合する方法を示します。

設定

Fusion Middleware ControlでOracle Identity Federationに対して構成されているユーザー・データ・ストアは、認証エンジンで使用されるLDAPサーバーを参照します。

パッケージ化

認証エンジンは、ルート・コンテキストが/engineに設定されたWebアプリケーションで構成され、次の2つのJSPページを含んでいます。

  • loginpage.jsp: フェデレーション・サーバーからの受信リクエストを処理し、ログイン・ページを表示します。

  • ldapforward.jsp: ユーザーの資格証明をLDAPサーバーに対して認証し、認証成功時にユーザーをフェデレーション・サーバーに転送します。

エンジンの追加

エンジンを追加するには、次の手順を実行します。

  1. Fusion Middleware Controlで、Oracle Identity Federationインスタンスに移動します。

  2. 「管理」「認証エンジン」の順に移動します。「認証エンジン」→「カスタム」タブを選択します。

  3. 認証エンジンを追加するには、「追加」をクリックして、認証エンジンの名前を入力します。Oracle Identity Federationにより、その新しいエンジンに対するIDが生成されます。このテストでは、このIDはTEST_ENGINE_IDとして参照します。

  4. 認証エンジンを選択して、次のように変更します。

    • エンジンを有効にします。

    • 認証エンジンの「Webコンテキスト」を/engineに設定します。

    • 認証エンジンの「ログイン相対パス」を/loginpage.jspに設定します。

  5. 変更を保存します。

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項「ログアウト」を参照)。

10.4 カスタムSP統合エンジンの作成

この項では、カスタムSP統合エンジンを計画、開発および実装する方法を説明します。


関連項目:

  • SP統合エンジンの説明と、このエンジンがOracle Identity Federationアーキテクチャに組み込まれる方法は、第10.2.1項「アーキテクチャ」を参照してください。


10.4.1 カスタム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で構成されているユーザー・データ・ストアと同じであることの確認。

10.4.2 統合モジュールの開発および実装

この項では、統合モジュールを開発する方法と、フェデレーション環境に実装する方法を説明します。

10.4.2.1 パスURL

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およびcontextPathrelativePathを把握する必要があります。これは、フェデレーション・サーバーによって着信アサーションが処理された後にフェデレーションSSO処理の結果を処理するURLです。

10.4.2.2 SP統合エンジンの追加または変更

SP統合エンジンを追加または変更するには、次の手順を実行します。

  1. Fusion Middleware Controlで、Oracle Identity Federationインスタンスに移動します。

  2. 「管理」→「SP統合モジュール」に移動します。「カスタムSPエンジン」タブをクリックします。

  3. SP統合エンジンを追加するには、「追加」をクリックして、SP統合エンジンの名前を入力します。Oracle Identity Federationにより、新しいエンジンに対するIDが生成されます。


    注意:

    Fusion Middleware Controlでは、名前は表示目的でのみ使用し、Oracle Identity Federationと認証エンジン間の通信ではIDを使用します。


  4. SP統合エンジンを変更するには、エンジンを選択して、次の操作を実行します。

    • エンジンを有効または無効にします。

    • 「Webコンテキスト」フィールドで、SP統合エンジンのcontextPathを指定します。

    • 「ログイン相対パス」フィールドに、SP統合エンジンのログイン・サービスの相対パスを指定します。

    • アサーション処理中にローカル認証手順を実行する必要がある場合に使用する認証メカニズムを選択します(これは、ユーザー・レコードへのアサーションのマップにフェデレーテッドIDが使用されている場合にフェデレーション・レコードが存在しないときに発生します。この場合、レコードを作成する1回かぎりの操作を実行するために、ユーザーをローカルに認証する必要があります)。

    • ログアウトを有効または無効にします。

    • 「ログアウト相対パス」フィールドに、SP統合エンジンのログアウト・サービスの相対パスを指定します。

  5. 変更を保存します。

10.4.2.3 サービスの実装

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エンジンの識別子(Stringoracle.security.fed.sp.engineidで識別)。

  • Oracle Identity Federationサーバーが認証エンジンを使用してユーザーをローカルに認証すべきか、またはユーザーを認証用にIdPにリダイレクトしてフェデレーションSSOを開始すべきかを示す、オプションのboolean(Booleanoracle.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であるか指定されていない場合は、このパラメータは無視されます。許容される値は、プロトコルに応じて、httpredirecthttpostまたはhttppostsimpleになります。

  • アサーションを含むレスポンスの送信時に使用するバインディングを表すString(oracle.security.fed.sp.responsebindingで識別)。usedefaultがtrueであるか指定されていない場合は、このパラメータは無視されます。許容される値は、プロトコルに応じて、artifactまたはhttpostになります。

  • 認証中に使用するようにIdPにリクエストする認証コンテキスト比較をSPに対して指定する、オプションの認証メカニズム比較(oracle.security.fed.sp.authnmechcomparisonで識別)。usedefaulttrueであるか指定されていない場合は、このパラメータは無視されます。

  • 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で識別)

  • ユーザーを識別するために使用する認証メカニズム(Stringoracle.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リクエストで使用可能になります。

10.4.3 サンプルの統合モジュール

次の2つの項では、カスタム認証エンジンの実装例を示します。

  • サンプルの統合モジュール1: Oracle WebLogic Server JavaEE統合

  • サンプルの統合モジュール2: カスタム・シングル・サインオン統合


注意:

この後でサンプルの統合モジュール1および2として説明されているカスタム統合および認証用以外のアプリケーションをOracle WebLogic管理対象サーバーにデプロイすると、セキュリティ上のリスクが発生する可能性があるため、そのようなデプロイは行わないことをお薦めします。無関係なアプリケーションをOracle WebLogic管理対象サーバーにデプロイしたすると、悪意のあるソフトウェアによってサーバー・フローの動作が変更される可能性があるため、フェデレーション・サーバーのセキュリティに悪影響を及ぼすことがあります。


10.4.4 サンプルの統合モジュール1: Oracle WebLogic Server JavaEEコンテナ統合

この項では、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: アプリケーションとして機能します。HttpSessionfeduserid属性を検索し、属性が見つからない場合はフェデレーションSSOをトリガーします。

SP統合エンジンの追加または変更

SP統合エンジンを追加または変更するには、次の手順を実行します。

  1. Fusion Middleware Controlで、Oracle Identity Federationインスタンスに移動します。

  2. 「管理」「SP統合モジュール」に移動します。「カスタムSPエンジン」タブをクリックします。

  3. SP統合エンジンを追加するには、「追加」をクリックして、SP統合エンジンの名前を入力します。Oracle Identity Federationにより、その新しいエンジンに対するIDが生成されます。このテストでは、このIDはTEST_ENGINE_IDとして参照します。

  4. SP統合エンジンを変更するには、エンジンを選択して、次の操作を実行します。

    • エンジンを有効にします。

    • 認証エンジンの「Webコンテキスト」を/engineに設定します。

    • SP統合エンジンの「ログイン相対パス」を/wlsintegration.jspに設定します。

    • アサーション処理中にローカル認証手順を実行する必要がある場合に使用する認証メカニズムを選択します(これは、ユーザー・レコードへのアサーションのマップにフェデレーテッドIDが使用されている場合にフェデレーション・レコードが存在しないときに発生します。この場合、レコードを作成する1回かぎりの操作を実行するために、ユーザーをローカルに認証する必要があります)。

  5. 変更を保存します。

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項「ログアウト」を参照)。

10.4.5 サンプルの統合モジュール2: カスタム・シングル・サインオン統合

この項で示す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統合エンジンを追加または変更するには、次の手順を実行します。

  1. Fusion Middleware Controlで、Oracle Identity Federationインスタンスに移動します。

  2. 「管理」「SP統合モジュール」に移動します。「カスタムSPエンジン」タブをクリックします。

  3. SP統合エンジンを追加するには、「追加」をクリックして、SP統合エンジンの名前を入力します。Oracle Identity Federationにより、その新しいエンジンに対するIDが生成されます。このテストでは、このIDはTEST_ENGINE_IDとして参照します。

  4. SP統合エンジンを変更するには、エンジンを選択して、次の操作を実行します。

    • エンジンを有効にします。

    • 認証エンジンの「Webコンテキスト」を/engineに設定します。

    • SP統合エンジンの「ログイン相対パス」を/domainintegration.jspに設定します。

    • アサーション処理中にローカル認証手順を実行する必要がある場合に使用する認証メカニズムを選択します(これは、ユーザー・レコードへのアサーションのマップにフェデレーテッドIDが使用されている場合にフェデレーション・レコードが存在しないときに発生します。この場合、レコードを作成する1回かぎりの操作を実行するために、ユーザーをローカルに認証する必要があります)。

  5. 変更を保存します。

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項「ログアウト」を参照)。

10.5 ログアウト

この項では、ログアウト・フローを構成する方法を説明します。

10.5.1 ログアウト・フローの変更

この項には、ログアウト中のリダイレクションに関連する内容が含まれます。

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エンジンに送信する際に、次の処理を実行します。

  1. エンジンのWebコンテキストおよび相対ログアウト・パスへの内部転送を実行します。

  2. oracle.security.fed.authn.engineid(エンジンが認証エンジンの場合)またはoracle.security.fed.sp.engineid(エンジンがSPエンジンの場合)で参照されるHttpServletRequestの属性に、呼び出すエンジンのエンジンIDを指定します。

  3. オプションで、oracle.security.fed.sessionidで参照され、ログアウト対象のユーザー・セッションの識別子(Stringオブジェクト)を格納する属性をHttpServletRequestで指定します。

認証エンジンまたはSPエンジンによるユーザーのログアウト時に、エンジンはユーザーをOracle Identity Federationに内部的に転送して戻し、次の処理を実行します。

  1. /fed Webコンテキストおよび/user/logoutretssoへの内部転送を実行します。

  2. oracle.security.fed.authn.engineid(エンジンが認証エンジンの場合)またはoracle.security.fed.sp.engineid(エンジンがSPエンジンの場合)で参照されるHttpServletRequestの属性に、呼び出されたエンジンのエンジンIDを指定します。この属性値は、ログアウト処理を実行したエンジンの識別子です。

認証エンジンまたはSPエンジンによるOracle Identity Federationの呼出し

認証エンジンまたはSPエンジンは、ログアウト時にOracle Identity Federationを呼び出す場合、次の処理を実行します。

  1. /fed Webコンテキストおよび/user/logoutssoへの内部転送を実行します。

  2. oracle.security.fed.authn.engineid(エンジンが認証エンジンの場合)またはoracle.security.fed.sp.engineid(エンジンがSPエンジンの場合)で参照されるHttpServletRequestの属性に、呼び出すエンジンのエンジンIDを指定します。この属性値は、ログアウト用に呼び出すエンジンの識別子です。

  3. Oracle Identity Federationがログアウト後にユーザーをリダイレクトする戻りURLを指定します。このURLは、oracle.security.fed.logout.returnurlで参照されるHttpServletRequestの属性で指定します。

ログアウト・フローの最後に、ユーザーはOracle Identity Federationからログアウトされ、戻りURLにリダイレクトされます。

10.5.2 サンプルのログアウト・サービス

次の2つの項では、ログアウト・サービスの次の使用例を概説します。

  • ログアウト・サービス例1では、認証エンジンとSP統合エンジンの両方がカスタマイズされている場合のカスタム・ログアウト・サービスについて説明します。

  • ログアウト・サービス例2では、SP統合エンジンのみがカスタマイズされている場合のカスタム・ログアウト・サービスについて説明します。

10.5.3 ログアウト・サービス例1

この項では、認証エンジンと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パラメータにリダイレクトします。

エンジンの更新

エンジンを更新するには、次の手順を実行します。

  1. Fusion Middleware Controlで、Oracle Identity Federationインスタンスに移動します。

  2. 「管理」「SP統合モジュール」に移動します。「カスタムSPエンジン」タブをクリックします。

  3. SP統合エンジンを変更するには、エンジンを選択して、次の操作を実行します。

    • ログアウト・エンジンを有効にします。

    • SP統合エンジンの「ログアウト相対パス」を/logout.jspに設定します。

  4. 変更を保存します。

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);
%>

10.5.4 ログアウト・サービス例2

この項では、SP統合エンジンがカスタマイズされている場合に、カスタム・ログアウト・サービスを統合する方法を説明します。

設定

この例では、SP統合エンジンは、第10.4.5項「サンプルの統合モジュール2: カスタム・シングル・サインオン統合」で説明したカスタマイズされたSSO統合エンジンです。

パッケージ化

ログアウト・サービスは、認証およびSP統合エンジンとバンドルされている次のJSPページで構成されています。

  • domainlogout.jsp: Oracle Identity Federationからのリクエストを処理し、Cookieを削除し、ユーザーを/logoutretsso URLにリダイレクトします。

エンジンの更新

エンジンを更新するには、次の手順を実行します。

  1. Fusion Middleware Controlで、Oracle Identity Federationインスタンスに移動します。

  2. 「管理」「SP統合モジュール」に移動します。

  3. SP統合エンジンを変更するには、エンジンを選択して、次の操作を実行します。

    • ログアウト・エンジンを有効にします。

    • SP統合エンジンの「ログアウト相対パス」/domainlogout.jspに設定します。

  4. 変更を保存します。

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);
%>