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

前
 
次
 

12 カスタム・アクションの実装

カスタム・アクションを使用すると、Oracle Identity Federationフローで認証エンジンまたはSP統合エンジンの呼出し前または後に、サイト固有の操作を実行できます。

Oracle Identity Federationでは、前処理および後処理アクション・プラグインを使用してカスタム・アクションを実装します。この章では、カスタム・アクションを実装する方法について説明します。


注意:

ここでは、Oracle Identity Federationをフェデレーション・サーバーとも呼びます。


12.1 カスタム・アクションの概要

前処理および後処理プラグインは、認証フロー中に呼び出されるJSPまたはJavaEEサーブレットとして実装されます。

カスタム・アクションは、カスタム・エンジンも含め、すべての認証エンジンおよびSP統合エンジンで使用できます。この項では、アクションがどのように機能し、Oracle Identity Federationとどのように相互作用するかについて説明します。

12.1 認証エンジン用の前処理および後処理カスタム・アクション

Oracle Identity Federationは、実行時にユーザーの識別が必要な場合に認証エンジンを呼び出します。次のステップは、イベントの一般的なフローを示しています。

  1. Oracle Identity Federationが次のステップを実行します。

    • ユーザーを識別する必要があることを判断します。

    • 使用する認証エンジンを選択します。

    • 認証エンジンの場所を取得します。

    • エンジンのエンドポイントのルート・コンテキストと相対パスを指定して、ユーザーを認証エンジンに内部的に転送します。

  2. ユーザー・アイデンティティを確認するために外部認証プロバイダと対話するプラガブル・モジュールである認証エンジンが、次のステップを実行します。

    • ユーザーと対話して、資格証明を取得します。たとえば、LDAP認証エンジンはユーザー資格証明を取得するためにログイン・ページを表示します。取得した資格証明はLDAPディレクトリとの照合により検証されます。

    • 成功した場合は、ユーザーを認証情報とともにOracle Identity Federationに内部的に転送して戻します。認証情報は、ユーザー識別子とアイデンティティが確認された時刻から構成されます。

  3. Oracle Identity Federationが情報を分析し、ユーザー・セッションを作成または更新します。

カスタム・アクションを使用して次のことを行えます。

  • フェデレーション・サーバーと認証エンジン間で交換されるデータを操作する。たとえば、ユーザー名johndoeから電子メール・アドレスjohndoe@mycompany.comを作成できます。

  • 認証中に追加のステップを実行する。たとえば、ユーザーに関する情報をさらに得るために、外部のデータソースまたはシステムに接続できます。

カスタム・アクション・プラグインを設定するには、次の操作を実行します。

  • 認証エンジンの呼出し前に実行される前処理アクション・プラグインを実装します。

  • 認証後に、ユーザーが認証エンジンからOracle Identity Federationにリダイレクトされる際に実行されるアクションや変更に応じた後処理プラグインを実装します。

  • Oracle Identity Federationが実行されているWebLogic管理対象サーバーにプラグインをデプロイします。

  • 認証エンジンのかわりにプラグインを呼び出して、プラグインが前処理タスクを実行できるように、Oracle Identity Federationを構成します。

  • Oracle Identity Federationにリダイレクトするかわりにプラグインを呼び出して、プラグインが後処理タスクを実行できるように、認証エンジンを構成します。


    注意:

    デフォルトの(出荷時に設定されている)認証エンジンを使用している場合は、Oracle Identity Federation構成を変更する必要があります。カスタム・エンジンを使用している場合は、そのエンジンを更新する必要があります。


12.1.2 SP統合エンジン用の前処理および後処理カスタム・アクション

Oracle Identity Federationがサービス・プロバイダとして機能している場合、次のいずれかの操作が行われます。

  • IDおよびアクセス管理(IAM)システム(Oracle Access Managerなど)が、フェデレーテッドSSO処理を実行してリモート・アイデンティティ・プロバイダでユーザーを認証するために、Oracle Identity Federationを呼び出します。

  • リモート・アイデンティティ・プロバイダが、SPドメイン内の保護リソースにユーザーがアクセスできるようにフェデレーテッドSSO処理を開始します。

    IAMシステムがフェデレーテッドSSOのためにOracle Identity Federationを呼び出す場合のフローは次のとおりです。

    1. ユーザーが、IAMシステムで保護されているリソースへのアクセスを試みます。

    2. IAMシステムが、フェデレーテッドSSO処理によって認証される必要があることを判断します。

    3. IAMシステムが、統合されているOracle Identity Federation SPエンジンにユーザーをリダイレクトします。

    4. Oracle Identity Federation SP統合モジュール(カスタム・モジュールの場合もある)がなんらかの操作を行い、操作に必要な情報を指定してユーザーをOracle Identity Federationに内部的に転送します。たとえば、使用する認証メカニズム、リレー状態などを指定できます。

    5. Oracle Identity Federationが情報を処理し、フェデレーテッドSSO処理をトリガーし、認証用にリモート・アイデンティティ・プロバイダにユーザーをリダイレクトします。

    6. アイデンティティ・プロバイダがユーザーを識別してアサーションを作成し、ユーザーをOracle Identity Federation/SPにリダイレクトして戻します。

    7. Oracle Identity Federationがアサーションを検証し、ローカル・ドメイン内のユーザーにマップし、ユーザーに対するOracle Identity Federationセッションを作成します。

    8. Oracle Identity Federationが、フローをトリガーしたSP統合モジュール(またはIdP開始のSSO処理の場合はデフォルトのSP統合モジュール)にユーザーを内部的に転送して戻します。

    9. SP統合モジュールがデータを処理してWebアクセス・セッションを作成し、ユーザーを保護リソースにリダイレクトします。

    10. IAMシステムが、リソースへのアクセスをユーザーに許可します。

    カスタム・アクションを使用して、フェデレーション・サーバーとSP統合モジュール間で交換されるデータをカスタマイズし、処理中に特定のアクションを実行できます。

    カスタム・アクション・プラグインを設定するには、次の操作を実行します。

    • SP統合モジュールがOracle Identity Federationにユーザーをリダイレクトしてフローを開始する前にアクションまたは変更を実行する必要がある場合は、前処理プラグインを実装します。

    • フェデレーテッドSSO処理の後、ユーザーがOracle Identity FederationからSP統合モジュールにリダイレクトされる際にアクションまたは変更を実行する必要がある場合は、後処理プラグインを実装します。

    • Oracle Identity Federationが実行されているWebLogic管理対象サーバーにプラグインをデプロイします。

    • Oracle Identity Federationにリダイレクトするかわりにプラグインを呼び出して、プラグインがカスタム・タスクを実行できるように、SP統合モジュールを構成します。


      注意:

      デフォルトの(出荷時に設定されている)SP統合モジュールを使用している場合は、Oracle Identity Federation構成を変更する必要があります。カスタム・エンジンを使用している場合は、そのエンジンを更新する必要があります。


    • SP統合モジュールのかわりにプラグインを呼び出して、プラグインがカスタム・タスクを実行できるように、Oracle Identity Federationを構成します。

12.1.3 カスタム・アクションのアーキテクチャ

図12-1に、カスタム・アクション・プラグインのアーキテクチャを示します。

図12-1 カスタム・アクション・プラグイン

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

この図では、Oracle Identity Federationはカスタマイズされており、次の時点でプラグインを呼び出すように構成されています。

  • SP統合エンジンがOracle Identity Federationを呼び出す前

  • Oracle Identity FederationがSP統合エンジンを呼び出す前

  • Oracle Identity Federationが認証エンジンを呼び出す前

  • 認証エンジンがOracle Identity Federationを呼び出す前

12.1.3.1 SPとしてのOracle Identity Federationのフロー

Oracle Identity Federationがサービス・プロバイダとして機能するフェデレーテッドSSO処理のフローは次のとおりです。

  1. Oracle Access ManagerなどのIDおよびアクセス管理(IAM)モジュールが、フェデレーテッドSSO処理を開始するためにSP統合エンジンを呼び出します。SP統合エンジンが、カスタム・アクションを実行するためのSPエンジン用の前処理プラグインを呼び出します。

  2. SPエンジン用の前処理プラグインが、フェデレーテッドSSOフローを開始するためにOracle Identity Federationを呼び出します。

  3. Oracle Identity Federationが、ユーザーの認証およびアサーションの作成が行われるIdPにユーザーをリダイレクトします。

  4. IdPが、検証およびユーザーへのマップが行われたアサーションとともに、ユーザーをOracle Identity Federationにリダイレクトして戻します。

  5. Oracle Identity Federationがユーザーとアサーション・データをバンドルし、なんらかのカスタム・タスクを実行するためにSPエンジン用の後処理プラグインを呼び出します。

  6. 後処理プラグインがユーザーとアサーション・データを提供して、SP統合エンジンを呼び出します。

  7. SPエンジンがIAMドメイン内にユーザー・セッションを作成し、ユーザーを保護リソースにリダイレクトします。

12.1.3.2 ユーザーを認証するOracle Identity Federationのフロー

Oracle Identity Federationがユーザーを認証する必要がある場合のフローは次のとおりです。

  1. Oracle Identity Federationが実行時フローの一環として、ユーザーをローカルに認証する必要があることを判断します。なんらかのカスタム・タスクを実行するために認証エンジン用の前処理プラグインを呼び出します。

  2. 前処理プラグインが認証エンジンを呼び出します。

  3. 認証エンジンが、IAMドメインを使用してユーザーをチャレンジし、識別します。

  4. 認証エンジンが認証データをバンドルし、なんらかのカスタム・タスクを実行するために認証エンジン用の後処理プラグインを呼び出します。

  5. 認証エンジン用の後処理プラグインが、認証データを提供して、Oracle Identity Federationを呼び出します。

  6. Oracle Identity Federationが処理を再開します。

12.2 認証エンジン用の前処理カスタム・アクション

前処理プラグインは、認証操作の一環として、認証エンジンを呼び出す前にユーザーがリダイレクトされるモジュールです。このプラグインにより、認証前にカスタム・アクションを実行することが可能になります。

プラグインの使用時には、Oracle Identity Federationはユーザーを認証エンジンにリダイレクトしません。かわりに、ユーザーをプラグインに内部的に転送し、認証中に使用する特定のデータをプラグインに渡します。カスタム・アクションの実行後、プラグインはフェデレーション・サーバーによって提供された元のデータとともに、認証フローを再開するように、ユーザーを適切な認証エンジンに転送します。

12.2.1 前処理カスタム・アクションの実装

カスタム・アクションとOracle Identity Federationとの相互作用

Oracle Identity Federationはユーザーを認証エンジンにリダイレクトするときに、HttpServletRequestオブジェクトの属性として、特定のデータをエンジンに渡します。同じデータが前処理プラグインにも提供されます。

  • ユーザーのIDのチャレンジ時に使用する認証メカニズム(String、oracle.security.fed.authn.authnmechで識別)。

  • 実行中のアクションを参照する識別子(String、oracle.security.fed.authn.refidで識別)。

  • フェデレーテッドSSO処理が行われている場合は、このローカル認証をリクエストしているリモート・サービス・プロバイダのプロバイダIDと説明(String、それぞれoracle.security.fed.authn.provideridおよびoracle.security.fed.authn.providerdescriptionで識別)。

  • ユーザーの認証に使用するエンジンを参照する識別子(String、oracle.security.fed.authn.engineidで識別)。

  • 設定されている場合は、ユーザーの識別子(String、oracle.security.fed.authn.useridで識別)。

  • ユーザーがすでに認証済でもエンジンがユーザーをチャレンジすべきかどうかを示す強制認証フラグ。指定されていない場合、falseとみなされます。(Boolean、oracle.security.fed.authn.forceauthnで識別)

  • エンジンがユーザーと視覚的に対話可能かどうかを示すパッシブ・フラグ。指定されていない場合、falseとみなされます(Boolean、oracle.security.fed.authn.passiveで識別)

  • オプションで、エンジンが設定する必要がある属性のマップ。これらの属性は、特定のリモート・プロバイダの構成で指定されたとおりに、Oracle Identity Federation/IdPがAttributeStatementを使用してアサーションを正しく作成するために必要です。(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メッセージ

  • ユーザーがすでにアクティブなセッションを開始している場合は、オプションでOracle Identity Federationのセッション識別子。Oracle Identity Federationは、認証エンジンがユーザーにリンクされた状態を維持できるように、すでに存在するユーザー・セッションのセッション識別子をエンジンに渡し、セッションID値を使用してそのデータを参照します。(String、oracle.security.fed.sessionidで識別)

    後でログアウト・フローが実行される際に、このユーザー・セッションで使用されたデータをエンジンが削除できるように、Oracle Identity Federationはセッション識別子をエンジンに渡します。

認証エンジンへのユーザーの転送

処理後に、前処理プラグインはユーザーを適切な認証エンジン(プラグインがない場合にOracle Identity Federationが呼び出すエンジン)に転送する必要があります。

HttpServletRequestオブジェクト内にあるoracle.security.fed.authn.engineid属性を使用して、ユーザーの内部転送先のパスを決定できます。使用可能なエンジンID値を表12-1に示します。

表12-1 認証エンジンのエンジンID

エンジンID 意味

osso

ルート・コンテキスト/fedおよび相対パス/user/authnossoで参照されるエンドポイントへの転送を実行することにより、Oracle Single Sign-Onエンジンを呼び出します。

oam

ルート・コンテキスト/fedおよび相対パス/user/authnoamで参照されるエンドポイントへの転送を実行することにより、Oracle Access Managerエンジンを呼び出します。

ldap

ルート・コンテキスト/fedおよび相対パス/user/authnldapで参照されるエンドポイントへの転送を実行することにより、LDAPエンジンを呼び出します。

rdbmssec

ルート・コンテキスト/fedおよび相対パス/user/authnrdbmssecで参照されるエンドポイントへの転送を実行することにより、RDBMSセキュリティ・エンジンを呼び出します。

rdbmstable

ルート・コンテキスト/fedおよび相対パス/user/authnrdbmstbで参照されるエンドポイントへの転送を実行することにより、RDBMS表エンジンを呼び出します。

jaas

ルート・コンテキスト/fedおよび相対パス/user/authnjaasで参照されるエンドポイントへの転送を実行することにより、JAASエンジンを呼び出します。

infocard

ルート・コンテキスト/fedおよび相対パス/user/authnicで参照されるエンドポイントへの転送を実行することにより、情報カード・エンジンを呼び出します。

proxy

ルート・コンテキスト/fedおよび相対パス/user/authnproxyで参照されるエンドポイントへの転送を実行することにより、フェデレーションSSOプロキシ・エンジンを呼び出します。

httpheader

ルート・コンテキスト/fedおよび相対パス/user/authnhttpで参照されるエンドポイントへの転送を実行することにより、HTTPヘッダー・エンジンを呼び出します。



注意:

  • プラグインは、認証フローの一環としてプラグインに渡されたデータ(すなわちHttpServletRequestオブジェクトに設定されている属性)を認証エンジンに提供する必要があります。

  • プラグインは、HttpServletRequestオブジェクトに設定されているすべての属性(oracle.security.fed.authn.authnmech、oracle.security.fed.authn.refidおよびoracle.security.fed.authn.engineid属性を除く)を変更できます。


12.2.2 カスタム・アクション用のOracle Identity Federationの構成

次の作業を実行することにより、ユーザーを前処理プラグインに転送するようにOracle Identity Federationを構成します。

  • フローを変更する認証エンジンを指定します。選択可能なエンジンは、Oracle SSO、OAM、LDAP、RDBMSセキュリティ、RDBMS表、プロキシ、JAASおよび情報カードです。

  • 次の2つのプロパティを作成または設定します。

    • Webコンテキスト・プロパティ: 前処理プラグインのカスタムJSPページまたはサーブレットが置かれているWebコンテキストを参照します。このプロパティは、Oracle Identity Federation構成のauthnenginesグループにあります。

    • 相対パス・プロパティ: カスタム・プラグインが置かれているWebコンテキスト内のパスを参照します。

表12-2に、各認証エンジンのプロパティの設定方法を示します。

表12-2 前処理プラグインに対する認証エンジンの構成

認証
エンジン
Webコンテキスト・プロパティ 相対パス・プロパティ

Oracle Single Sign-On

osso-login-context(デフォルトは、指定なし)

osso-login(デフォルトは、/user/authnosso)

Oracle Access Manager

oam-login-context(デフォルトは、指定なし)

oam-login(デフォルトは、/user/authnoam)

LDAP

ldap-login-context(デフォルトは、指定なし)

ldap-login(デフォルトは、/user/authnldap)

RDBMSセキュリティ

rdbmssec-login-context(デフォルトは、指定なし)

rdbmssec-login(デフォルトは、/user/authnrdbmssec)

RDBMS表

rdbmstable-login-context(デフォルトは、指定なし)

rdbmstable-login(デフォルトは、/user/authnrdbmstb)

JAAS

jaas-login-context(デフォルトは、指定なし)

jaas-login(デフォルトは、/user/authnjaas)

情報カード

infocard-login-context(デフォルトは、指定なし)

infocard-login(デフォルトは、/user/authnic)

フェデレーションSSOプロキシ

proxy-login-context(デフォルトは、指定なし)

proxy-login(デフォルトは、/user/authnproxy)

HTTPヘッダー

httpheader-login-context(デフォルトは、指定なし)

httpheader-login(デフォルトは、/user/authnhttp)


Oracle Identity Federation構成内でこれらのプロパティを設定するには、WLSTコマンドを使用します。

たとえば、Oracle SSOエンジンの前に前処理プラグインを呼び出すように構成するには、Oracle Identity FederationインスタンスのWLSTスクリプト環境で次のコマンドを使用します。

setConfigProperty('authnengines', 'osso-login-context', '/rootcontext', 'string')
 
setConfigProperty('authnengines', 'osso-login', '/relativepath', 'string')

12.3 認証エンジン用の後処理カスタム・アクション

認証エンジンが処理を完了した後、ユーザーがOracle Identity Federationにリダイレクトされる前に、ユーザーは認証操作の一環として後処理プラグイン・モジュールにリダイレクトされます。このプラグインにより、認証後にカスタム・アクションを実行することが可能になります。

プラグインの使用時には、認証エンジンは認証データとともにユーザーをプラグインに内部的に転送します。カスタム・アクションの実行後、プラグインは認証データとともにユーザーをOracle Identity Federationに転送します。


注意:

使用可能な認証エンジンは、Oracle SSO、OAM、LDAP、RDBMSセキュリティ、RDBMS表、プロキシ、JAAS、情報カードおよびHTTPヘッダーです。


12.3.1 後処理プラグインの実装

カスタム・アクションとOracle Identity Federationとの相互作用

認証エンジンは認証フロー中にユーザーをOracle Identity Federationにリダイレクトするときに、HttpServletRequestオブジェクトの属性として、次のデータをプラグインに渡します。

  • ユーザーの識別子(String、oracle.security.fed.authn.useridで識別)。

  • 認証時刻(Date、oracle.security.fed.authn.authntimeで識別)

  • 認証済セッションの有効期限(Date、oracle.security.fed.authn.expirationtimeで識別)

  • ユーザーを識別するために使用する認証メカニズム(String、oracle.security.fed.authn.authnmechで識別)。

  • リクエストからの、実行されたアクションを参照する識別子(String、oracle.security.fed.authn.refidで識別)。

  • ユーザーの認証に使用するエンジンを参照する識別子(String、oracle.security.fed.authn.engineidで識別)。

  • オプションで、ユーザー・セッションに格納される属性のマップ。このマップは、キーとしてStringオブジェクトを、値としてオブジェクトのセットを持ちます(oracle.security.fed.authn.attributesで識別)。

  • オプションで、Oracle Identity FederationがOracle Identity Federationユーザー・セッションの参照に使用するOracle Identity Federationのセッション識別子。これにより、エンジンとOracle Identity Federationは、同じ識別子を共有してユーザー・セッションを参照できます。(String、oracle.security.fed.sessionidで識別)

    後でログアウト・フローが実行される際に、このユーザー・セッションで使用されたデータをエンジンが削除できるように、Oracle Identity FederationはログアウトするセッションIDをエンジンに渡します。


注意:

  • プラグインは、認証フローの一環としてプラグインに渡されたデータ(すなわちHttpServletRequestオブジェクトに設定されている属性)をOracle Identity Federationサーバーに提供する必要があります。

  • プラグインは、HttpServletRequestオブジェクトに設定されているすべての属性(oracle.security.fed.authn.authnmech、oracle.security.fed.authn.refidおよびoracle.security.fed.authn.engineid属性を除く)を変更できます。


12.3.2 プラグイン用のOracle Identity Federationの構成

認証フローの後にユーザーを後処理プラグインに転送するようにOracle Identity Federationを構成するには、次のプロパティを設定します。

  • Webコンテキスト・プロパティを作成または設定します。これは、カスタムJSPページまたはサーブレットが置かれているWebコンテキストを参照します。このプロパティは、Oracle Identity Federation構成のserverconfigグループにあります。serverconfigauthncontext文字列プロパティを設定します(デフォルトは、指定なし)。

  • 相対パス・プロパティを設定します。これは、カスタムJSPページまたはサーブレットが置かれているWebコンテキスト内のパスを参照します。serverconfigauthnpath文字列プロパティを設定します(デフォルトは、/user/loginsso)。

Oracle Identity Federation構成内でこれらのプロパティを設定するには、WLSTコマンドを使用します。

たとえば、すべての認証エンジンの後に後処理プラグインを呼び出すように構成するには、Oracle Identity FederationインスタンスのWLSTスクリプト環境で次のコマンドを使用します。

setConfigProperty('serverconfig', 'authncontext', '/rootcontext', 'string')
 
setConfigProperty('serverconfig', 'authnpath', '/relativepath', 'string')

12.3.3 後処理カスタム・アクションの例

この項では、ローカル認証操作の最後にユーザーがOracle Identity Federationにリダイレクトされる前に、すべての組込み認証エンジンにより呼び出される単純な後処理プラグインを示します。このプラグインはブラウザにより提示されたカスタムCookieにアクセスし、そこからデータを抽出し、アサーションを作成する操作中に使用できるようにそのデータをOracle Identity Federationセッション属性として設定します。

Oracle Identity Federationは次の場合に、ローカル認証操作中に認証エンジンによって設定されるセッション属性をサポートします。

  • Oracle Identity FederationがIdPとして動作している場合

  • 認証エンジン・フローがいくつかの属性をattr1およびattr2と呼ばれるセッション属性として設定する場合

  • Oracle Identity Federationが特定のサービス・プロバイダ・パートナに対するアサーションの作成時に、attr1およびattr2として参照されるセッション属性を送信するように構成されている場合

この例は、組込み認証エンジンが使用されている場合に、ローカル認証フロー内で後処理プラグインがどのようにセッション属性を設定できるかを示しています。

この例では、プラグインは認証が成功した後、別のコンポーネントによって設定済のカスタムCookieから抽出した次の属性を追加します。

  • cookie-language: ユーザーの優先言語を含みます。

  • cookie-homepage: ユーザーの優先ホームページを含みます。

12.3.3.1 設定

カスタム・コンポーネントにより、この例で使用するCookieが設定されます。

12.3.3.2 パッケージ化

後処理プラグインは、ルート・コンテキストが/pluginに設定されたWebアプリケーションから構成され、カスタムCookieからデータを抽出し、セッション属性として設定する1つのJSPページcookieextract.jspを含みます。プラグインは、内部転送を使用してユーザーをフェデレーション・サーバーにリダイレクトすることにより、フローを再開します。

12.3.3.3 Oracle Identity Federationの構成

ローカル認証フローの最後にOracle Identity Federationサーバーの前に後処理プラグインを呼び出すようにOracle Identity Federationを構成するには、次の手順を実行します。

  1. Oracle Identity FederationインスタンスのWLSTスクリプト環境を入力します。

  2. 後処理プラグイン・ページのルート・コンテキストを含むauthncontextプロパティを設定します。

    setConfigProperty('serverconfig', 'authncontext', '/plugin', 'string')
    
  3. 後処理プラグイン・ページの相対パスを含むauthnpathプロパティを設定します。

    setConfigProperty('serverconfig', 'authnpath', '/cookieextract.jsp', 'string')
    
  4. WLSTスクリプト環境を終了します。

12.3.3.4 cookieextract.jspの実装

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");
 
// check if authentication was successful
if (request.getAttribute("oracle.security.fed.authn.authntime") != null)
{
        // authentication was successful. Attributes will be added
        Map attributes = (Map)request.getAttribute("oracle.security.fed.authn.attributes");
        if (attributes == null)
        {
                attributes = new HashMap();
                request.setAttribute("oracle.security.fed.authn.attributes", attributes);
        }
        
        // get the cookie
        Cookie[] cookies = request.getCookies();
        String cookieValue = null;
        for(int i = 0; i < cookies.length; i++)
        { 
                Cookie cookie = cookies[i];
                if (cookie.getName().equals("customcookie")) 
                        cookieValue = cookie.getValue();
        }
        if (cookieValue != null && cookieValue.length() > 0)
        {
                StringTokenizer st = new StringTokenizer(cookieValue, "+");
                String language = st.nextToken();
                String homepage = st.nextToken();
 
                Set languageValues = new HashSet();
                languageValues.add(language);
                attributes.put("cookie-language", languageValues);
 
                Set homepageValues = new HashSet();
                homepageValues.add(homepage);
                attributes.put("cookie-homepage", homepageValues);
        }
}
 
// forward to the OIF server to resume the flow
request.getSession().getServletContext().getContext("/fed").getRequestDispatcher("/user/loginsso").forward(request, response);
%> 

12.4 SP統合エンジン用の前処理カスタム・アクション

前処理プラグインは、フェデレーションSSO処理を開始するためにOracle Identity Federationサーバーにリダイレクトされるかわりに、SP SSOフローの一環としてSP統合モジュールからユーザーがリダイレクトされるモジュールです。このプラグインにより、SSOフロー前にカスタム・アクションを実行することが可能になります。

前処理プラグインの使用時は、SP統合モジュールは、フェデレーテッドSSO処理に使用される実行時データとともに、ユーザーをプラグインに内部的に転送します。プラグインはカスタム操作を実行し、ユーザーを実行時データともにOracle Identity Federationに転送して、フェデレーションSP SSOフローを再開します。

12.4.1 前処理プラグインの実装

SPエンジンはユーザーをOracle Identity Federationにリダイレクトするときに、HttpServletRequestオブジェクトの属性として、特定のデータをサーバーに渡します。同じデータが前処理プラグインにも提供されます。

プラグインに渡されるデータは次のとおりです。

  • フェデレーテッド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を含むリレー状態。(String、oracle.security.fed.sp.relaystateで識別)

  • SPエンジンがデフォルトのSPエンジン(Oracle Access Manager、Oracle Single Sign-OnまたはテストSPエンジンのいずれか)である場合に、ユーザーがアクセスしようとしていた保護リソース。(oracle.security.fed.sp.returnurlで識別)

  • SSOフローを開始したSPエンジンの識別子(String、oracle.security.fed.sp.engineidで識別)

  • Oracle Identity Federationが認証エンジンを使用してユーザーをローカルに認証すべきか、またはユーザーを認証用にIdPにリダイレクトすることによりフェデレーテッドSSOを開始すべきかを示す、オプションのフラグ(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で識別)。usedefaulttrueであるか指定されていない場合は、このパラメータは無視されます。

  • SSO処理中に、フェデレーション・レコードがまだ存在しない場合はレコードを作成することをSPがIdPに対して許可すべきか(Boolean、oracle.security.fed.sp.allowfedcreationで識別)。usedefaulttrueであるか指定されていない場合は、このパラメータは無視されます。

  • SSO処理中にユーザーと対話しないようにSPがIdPに指示すべきか(Boolean、oracle.security.fed.sp.passiveで識別)。usedefaulttrueであるか指定されていない場合は、このパラメータは無視されます。

  • AuthnRequestの送信時に使用するバインディング(String、oracle.security.fed.sp.requestbindingで識別)。usedefaulttrueであるか指定されていない場合は、このパラメータは無視されます。許容される値は、プロトコルに応じて、httpredirecthttpostおよびhttppostsimpleになります。

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

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

  • SSO処理に対してSPがIdPに発行する名前IDフォーマット(String、oracle.security.fed.sp.nameidformatで識別)。usedefaulttrueであるか指定されていない場合は、このパラメータは無視されます。

  • フェデレーションSSO処理中に、IdPに対してリクエストするオプションの属性(たとえばOpenID IdPとの対話時に)。データは、キーとしてStringを、値としてオブジェクトのセットを使用するマップとして渡されます(oracle.security.fed.sp.attributesで識別)。値はオプションですが、キーには属性名が含まれます。


関連項目:

SP統合エンジンにより提供されるデータの詳細は、第10.4.2項「統合モジュールの開発および実装」を参照してください。



注意:

  • プラグインは、SPフェデレーテッドSSOフローの一環として渡されたデータ(すなわちHttpServletRequestオブジェクトに設定されている属性)をOracle Identity Federationサーバーに提供する必要があります。

  • プラグインは、HttpServletRequestオブジェクトに設定されているすべての属性(oracle.security.fed.sp.engineid属性を除く)を変更できます。


12.4.2 プラグイン用のOracle Identity Federationの構成

SPフェデレーテッドSSOフローの開始時にユーザーを前処理プラグインに転送するようにOracle Identity Federationを構成するには、次のプロパティを設定します。

  • Webコンテキスト・プロパティを作成または設定します。これは、カスタムJSPページまたはサーブレットが置かれているWebコンテキストを参照します。このプロパティは、Oracle Identity Federation構成のserverconfigグループにあります。serverconfigspcontext文字列プロパティを設定します(デフォルトは、指定なし)。

  • 相対パス・プロパティを設定します。これは、カスタムJSPページまたはサーブレットが置かれているWebコンテキスト内のパスを参照します。serverconfigsppath文字列プロパティを設定します(デフォルトは、/sp/startsso)。

Oracle Identity Federation構成内でこれらのプロパティを設定するには、WLSTコマンドを使用します。

たとえば、SSOフローの前に前処理プラグインを呼び出すように構成するには、Oracle Identity FederationインスタンスのWLSTスクリプト環境で次のコマンドを使用します。

setConfigProperty('serverconfig', 'spcontext', '/rootcontext', 'string')
 
setConfigProperty('serverconfig', 'sppath', '/relativepath', 'string')

12.4.3 前処理プラグインの例

この例は、フェデレーションSSO処理を開始するためにユーザーがOracle Identity Federationに転送される前に、フェデレーションSSO処理で使用するIdPを判断するために、デフォルトのSPエンジンによって呼び出される単純な前処理プラグインを示します。

この例では、ローカル・ドメインにはOracle Access Managerによって保護されている2つのリソースがあります。

  • http://www.domain.com/resource1、使用するIdPはidp1.com

  • http://www.domain.com/resource2、使用するIdPはidp2.com

12.4.3.1 設定

Oracle Identity Federation/SPサーバーはOracle Access Managerに統合されています。

12.4.3.2 パッケージ化

前処理プラグインは、ルート・コンテキストが/pluginに設定されたWebアプリケーションから構成され、保護リソースのURLを評価し、使用するIdPを判断する1つのJSPページfedidpeval.jspを含みます。

12.4.3.3 Oracle Identity Federationの構成

フェデレーションSSOフローの最初にOracle Identity Federation処理の前に前処理プラグインを呼び出すようにOracle Access Manager SPエンジンを構成するには、次の手順を実行します。

  1. Oracle Identity FederationインスタンスのWLSTスクリプト環境を入力します。

  2. 前処理プラグイン・ページのルート・コンテキストを含むspcontextプロパティを設定します。

    setConfigProperty('serverconfig', 'spcontext', '/plugin', 'string')
    
  3. 前処理プラグイン・ページの相対パスを含むsppathプロパティを設定します。

    setConfigProperty('serverconfig', 'sppath', '/fedusercheck.jsp', 'string')
    
  4. WLSTスクリプト環境を終了します。

fedusercheck.jspの実装

Implementation of fedusercheck.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 returnURL = (String) request.getAttribute("oracle.security.fed.sp.returnurl");
String providerid = null;
 
if (returnURL != null && returnURL.startsWith("http://www.domain.com/resource1"))
{
        providerid = "idp1.com";
}
else if (returnURL != null && returnURL.startsWith("http://www.domain.com/resource2"))
 
{
        providerid = "idp2.com";
}
 
if (providerid != null)
        request.setAttribute("oracle.security.fed.sp.providerid", providerid);
 
// forward to OIF 
request.getSession().getServletContext().getContext("/fed").getRequestDispatcher("/sp/startsso").forward(request, response);
%>

12.5 SP統合エンジン用の後処理カスタム・アクション

後処理プラグインは、フェデレーテッドSSO処理の一環として、ユーザーがリダイレクトされるモジュールです。このプラグインにより、処理の完了後にカスタム・アクションを実行することが可能になります。

プラグインの使用時には、Oracle Identity FederationはユーザーをSPエンジンにリダイレクトしません。かわりに、ユーザーをプラグインに内部的に転送し、SSO処理で生成されたデータを渡します。カスタム・アクションの実行後、プラグインはフェデレーション・サーバーによって提供された元のデータとともに、認証フローを再開するように、ユーザーを適切なSPエンジンに転送します。

12.5.1 後処理プラグインの実装

Oracle Identity FederationはフェデレーテッドSSOフローの最後にユーザーをSPエンジンにリダイレクトするときに、HttpServletRequestオブジェクトの属性として、特定のデータをエンジンに渡します。同じデータが後処理プラグインにも提供されます。

プラグインに渡されるデータは次のとおりです。

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

  • SPエンジンがデフォルトのSPエンジン(Oracle Access Manager、Oracle Single Sign-OnまたはテストSPエンジンのいずれか)である場合に、ユーザーがアクセスしようとしていた保護リソース(oracle.security.fed.sp.returnurlで識別)。

  • 名前ID(アサーションの発行者)およびオプションの属性から構成されるアサーションの内容。

    アサーションの内容はXMLデータとしては渡されません。つまり、元のアサーションはモジュールには戻されません。かわりに、データは、キーが文字列で、値がオブジェクトのセットであるマップとして渡されます(oracle.security.fed.sp.attributesで識別)。追加のデータは次のように参照されます。

    • orafed-nameid-value - 名前ID値

    • orafed-nameid-qualifier - 名前ID修飾子

    • orafed-nameid-format - 名前IDフォーマット

    • orafed-providerid - プロバイダID

    • 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.security.fed.sessionidで識別)

    Oracle Identity Federationは、SPエンジンがユーザーにリンクされた状態を維持できるように、ユーザー・セッションのセッションIDを渡します。またOracle Identity Federationは、セッションID値を使用してそのデータを参照できます。後でログアウト・フローが実行される際に、このユーザー・セッションで使用されたデータをエンジンが削除できるように、Oracle Identity FederationはログアウトするsessionIDをエンジンに渡します。


注意:

  • プラグインは、SPフェデレーテッドSSOフローの一環として渡されたデータ(すなわちHttpServletRequestオブジェクトに設定されている属性)をSPエンジンに提供する必要があります。

  • プラグインは、HttpServletRequestオブジェクトに設定されているすべての属性(oracle.security.fed.sp.engineid属性を除く)を変更できます。


12.5.2 プラグイン用のOracle Identity Federationの構成

SSOフローの最後にSPエンジンではなく後処理プラグインにユーザーを転送するようにOracle Identity Federationを構成するには、次の作業を実行します。

  • フローを変更するSPエンジンを指定します。選択可能なエンジンは、Oracle SSO、Oracle Access Manager、テストSPおよびプロキシです。

  • 次の2つのプロパティを設定します。

    • Webコンテキスト・プロパティを作成または設定します。これは、後処理プラグインのカスタムJSPページまたはサーブレットが置かれているWebコンテキストを参照します。このプロパティは、Oracle Identity Federation構成のspenginesグループにあります。

    • 相対パス・プロパティを設定します。これは、カスタムJSPページまたはサーブレットが置かれているWebコンテキスト内のパスを参照します。

表12-2に、各SPエンジンのプロパティの設定方法を示します。

表12-3 後処理プラグインに対するSPエンジンの構成

SPエンジン Webコンテキスト・プロパティ 相対パス・プロパティ

Oracle Single Sign-On

osso-login-context(デフォルトは、指定なし)

osso-login(デフォルトは、/user/spretosso)

Oracle Access Manager

oam-login-context(デフォルトは、指定なし)

oam-login(デフォルトは、/user/spretoam)

テストSP

testsp-login-context(デフォルトは、指定なし)

testsp-login(デフォルトは、/user/testspretsso)

フェデレーションSSOプロキシ

proxy-login-context(デフォルトは、指定なし)

proxy-login(デフォルトは、/user/proxyretsso)


Oracle Identity Federation構成内でこれらのプロパティを設定するには、WLSTコマンドを使用します。

たとえば、フェデレーテッドSSO処理の最後に、Oracle SSO SPエンジンの前に後処理プラグインを呼び出すように構成するには、Oracle Identity FederationインスタンスのWLSTスクリプト環境で次のコマンドを使用します。

setConfigProperty('spengines', 'osso-login-context', '/rootcontext', 'string')
 
setConfigProperty('spengines', 'osso-login', '/relativepath', 'string')

12.5.3 後処理プラグインの例

この項では、フェデレーテッドSSOの最後にOracle Access Manager SPエンジンの前に、アサーションで参照されているユーザーが実際にアイデンティティ・プロバイダ(IdP)のローカル・ドメインに属していることを確認するために、Oracle Identity Federationによって呼び出される単純な後処理プラグインを示します。

Oracle Identity Federationは、フェデレーション・パートナとして複数のIdPを持つことができます。各IdPは、Oracle Identity Federation SPおよびフェデレーション・サーバーがデプロイされているローカル・ドメインのかわりに、ユーザーを認証します。

典型的なシナリオでは次のことが行われます。

  • ユーザーは認証のためにIdPにリダイレクトされます。

  • IdPがユーザーのアイデンティティを含むアサーションを作成します。

  • Oracle Identity Federation/SPが着信アサーションをローカル・ユーザー・レコードにマップし、ドメイン内に認証済セッションを作成します。

デプロイメントによっては、アサーションで参照されているユーザーがアサーション発行者のドメインに属していることを確認する必要がある場合があります。この場合、ユーザーはプライマリ・アイデンティティ・プロバイダを使用していると、SPドメインのサービスにしかアクセスできないことがあります。

この例では、アサーションの名前IDは電子メール・アドレスに基づいており、アドレス・ドメインは単一のIdPにマップされています。Oracle Identity Federation/SPは、次のIdPを認識しています。

  • http://idp.acme.com/fed/idp: このドメインのユーザーの対応する電子メール・アドレスは@acme.comです。

  • http://samlidp.foo.com/fed/idp: このドメインのユーザーの対応する電子メール・アドレスは@foo.comです。

  • http://fed.bar.com/fed/idp: このドメインのユーザーの対応する電子メール・アドレスは@bar.comです。

12.5.3.1 設定

Oracle Identity Federation/SPサーバーはOracle Access Managerに統合されています。

12.5.3.2 パッケージ化

後処理プラグインは、ルート・コンテキストが/pluginに設定されたWebアプリケーションから構成され、IdPから受信したアサーション・データを検証する1つのJSPページfedusercheck.jspを含みます。検証が成功すると、プラグインは、Oracle Access Managerセッションを作成し、ユーザーを保護リソースにリダイレクトできるように、内部転送によってユーザーをOracle Access Manager SPエンジンにリダイレクトします。

12.5.3.3 Oracle Identity Federationの構成

フェデレーテッドSSOフローの最後にOracle Access Manager SPエンジンの前に後処理プラグインを呼び出すようにOracle Identity Federationを構成するには、次の手順を実行します。

  1. Oracle Identity FederationインスタンスのWLSTスクリプト環境を入力します。

  2. 後処理プラグイン・ページのルート・コンテキストを含むoam-login-contextプロパティを設定します。

    setConfigProperty('spengines', 'oam-login-context', '/plugin', 'string')
    
  3. 後処理プラグイン・ページの相対パスを含むoam-loginプロパティを設定します。

    setConfigProperty('spengines', 'oam-login', '/fedusercheck.jsp', 'string')
    
  4. WLSTスクリプト環境を終了します。

12.5.3.4 fedusercheck.jspの実装

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");
 
Map attributes = (Map)request.getAttribute("oracle.security.fed.sp.attributes");
String email = (String)attributes.get("orafed-nameid-value");
String providerid = (String)attributes.get("orafed-providerid");
 
// check that email address is linked to providerid
if ("http://idp.acme.com/fed/idp".equals(providerid))
{
        // acme domain
        if (!email.endsWith("@acme.com"))
        {
                throw new Exception("User is invalid: " + email + " does not belong to " + providerid);
        }
}
else if ("http://samlidp.foo.com/fed/idp".equals(providerid))
{
        // foo domain
        if (!email.endsWith("@foo.com"))
        {
                throw new Exception("User is invalid: " + email + " does not belong to " + providerid);
        }
}
else if ("http://fed.bar.com/fed/idp".equals(providerid))
{
        // bar domain
        if (!email.endsWith("@bar.com"))
        {
                throw new Exception("User is invalid: " + email + " does not belong to " + providerid);
        }
}
else
        throw new Exception("Unknown IdP: " + providerid);
 
// forward to the OAM SP Engine to resume the flow
request.getSession().getServletContext().getContext("/fed").getRequestDispatcher("/user/spretoam").forward(request, response);
%>