ヘッダーをスキップ
Oracle Access Manager開発者ガイド
10g(10.1.4.2.0)
E05808-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

3 アイデンティティ・イベント・プラグインAPI

アイデンティティ・イベント・プラグインAPIを使用すると、基本のアイデンティティ・システムの機能を拡張できます。このAPIによって、アイデンティティ・システム・アプリケーションと外部ソフトウェア・コンポーネント間でアイデンティティ・システムのデータをやり取りするための経路ができます。このAPIのアプリケーションは、アイデンティティ・システムで使用している基本ロギングと同様に単純なものにすることも、また、データのフィルタ処理用パイプラインのように洗練したものにすることも、あるいはERPシステムへのシームレスなブリッジとすることもできます。

アイデンティティ・イベント・プラグインAPIは、アイデンティティ・システム製品のコンポーネントで、標準でインストールされます。

内容は次のとおりです。

この章は、次の項から構成されます。

3.1 アイデンティティ・イベント・プラグインAPIの概要

Webサーバーを構成してHTTPリクエストのライフ・サイクル内でCGIプログラムやサーバー側スクリプトを実行できるのと同様に、アイデンティティ・イベント・プラグインAPIによって、開発者は、アクションまたはイベント・ハンドラと呼ばれる独自の小さなアプリケーションを提供してアイデンティティ・システムを拡張し、カスタム・ビジネス・ロジックの実行および外部システムとの統合を行うことができます。イベント・ハンドラをイベントに接続するには、oblixpppcatalog.lstという名前の特殊な構成ファイルを使用します。アイデンティティ・システムは特定のデータをアクションから利用可能とします。これにより、アクションはそのデータを変更してイベントの結果に影響を及ぼすことができます。

10gリリース3(10.1.3)では、グローバリゼーションとローカリゼーションのためのマルチバイト・キャラクタをサポートするために、実行可能ファイルに送信されるアイデンティティ・イベント・プラグインのデータ、XMLページおよびSOAP/IdentityXMLリクエストには、UTF-8エンコーディングが使用されます。旧リリースでは、ISO-8859-1エンコーディング(Latin-1)が使用されていました。

Latin-1エンコーディングが使用されていた旧リリースとの下位互換性を提供するために、10g(10.1.4.0.1)では、ISO-8859-1エンコーディング(Latin-1)とUTF-8の両方で、IdentityXMLリクエストがサポートされます。ディスクに書き込まれるXML文書の場合、ISO-8859-1とUTF-8の両方のエンコーディングがサポートされます。IdentityXMLレスポンスは、リクエストと同じエンコーディング形式で発行されます。したがって、リクエストでLatin-1エンコーディング(encoding="ISO-8859-1")が使用されている場合は、レスポンスでLatin-1エンコーディングが使用されます。また、リクエストでUTF-8エンコーディングが使用されている場合は、対応するレスポンスでUTF-8エンコーディングが使用されます。


注意:

新規の10g(10.1.4.0.1)インストールでは、encoding="UTF-8"を使用することをお薦めします。アップグレード環境では、下位互換性のためにencoding="ISO-8859-1"を使用することをお薦めします。

IdentityXMLリクエストでencoding="ISO-8859-1"が使用されているとき、これに対するレスポンスにLatin-1キャラクタ・セット以外の文字が含まれている場合、このような文字を含むレスポンスでは文字化けが発生します。たとえば、リクエストにencoding="ISO-8859-1"が使用され、レスポンスに日本語またはアラビア語の文字が含まれている場合、これらの文字はレスポンスで文字化けを起こします。詳細は、『Oracle Access Managerアップグレード・ガイド』を参照してください。

3.1.1 アイデンティティ・イベント・プラグインAPIの使用例

このAPIは、パスワード検証、統合およびプロビジョニングでよく使用されます。

たとえば、パスワード検証アプリケーションで、セキュリティ設計者が2〜4桁の数字と1〜3文字の特殊文字を含む8文字のパスワードの使用を推奨するとします。開発者は、アイデンティティ・イベントAPIを使用するパスワード管理イベントのためにイベント・ハンドラを開発し、このイベント・ハンドラをアイデンティティ・システムのパスワード・ポリシーに追加できます。

別の例として、新入社員をRDBMSに登録して、入社案内パケットを受け取るようにする例を考えます。開発者は、各登録ワークフロー・インスタンスの有効化ステップ用にイベント・ハンドラを開発して、RDBMSベンダーのAPIを使用してリモート・データベースを更新できます。

最後の例として、新規ユーザーがログインIDとなるランダムに生成された一意IDを使用する場合を考えます。各登録ワークフロー・インスタンスの有効化ステップ用にイベント・ハンドラを開発して、必要な書式の一意の文字列を生成し、それをアイデンティティ・システムに戻してuid属性値として使用できます。

3.2 イベントのアクションへの接続

この項では、アクションとイベントについて詳述し、構成ファイルを使用してアクションとイベントを接続する方法について説明します。

3.2.1 イベントのタイプ

イベントとは、アイデンティティ・システム内で特定の状態が変更されることです。イベントの例は次のとおりです。

  • リクエストが受信され、ユーザー・マネージャの表示プログラムに渡されようとしている場合

  • 結果がグループ・マネージャ検索プログラムによって生成された場合

  • ユーザーがパスワードのリセットを試みて、チャレンジ・レスポンスを入力した場合

  • 「組織マネージャ」タブのプロファイル・ページの属性が変更された場合

  • 会社のITグループによる承認を待機していたワークフロー・チケットが承認された場合

  • ユーザーが新規パスワードを入力したが、強制するパスワード・ポリシーで外部の検証を要求している場合

アイデンティティ・システムによって、ここにまとめられた5つの異なるタイプのイベントに固有の機能が提供されます。イベントの各タイプの詳細は、「APIの動作」の項を参照してください。

3.2.1.1 アイデンティティ・システム・プログラム・イベント: PreとPost

これらは、最も頻繁に使用されるタイプのイベントです。各アイデンティティ・システム・アプリケーション(ユーザー・マネージャ、グループ・マネージャおよび組織マネージャ)には、アプリケーション内の各ページに表示するHTMLを生成するためのプログラム(表示、検索など)が多数含まれています。いずれかのプログラムが実行されると、イベントのペアが生成されます。それぞれのプログラムによって、このイベントのペアが認識されます。

Preイベントは、プログラムでページの作成が開始される前に生成されます。Preイベントによって、イベント・ハンドラは、リクエストがプログラムに到達する前にリクエストの処理が可能になります。Postイベントは、プログラムがページを作成後にHTMLページでユーザーに応答する前に生成されます。Postイベントによって、イベント・ハンドラはリクエストの処理結果を扱うことが可能になります。

これら2つのイベントは、下のダイアグラムに示すように、プログラムの前処理イベントと後処理イベントとして参照されます。

前処理イベントと後処理イベント。

3.2.1.2 OnChange

OnChangeイベント・インタラクションは、アイデンティティ・システム・アプリケーション(ユーザー・マネージャ、グループ・マネージャおよび組織マネージャ)のセットの構成要素として提供されています。具体的には、OnChangeイベントはこれらのアプリケーションそれぞれのプロファイル・ページに適用されます。これらのページのデータが変更されると、OnChangeイベントが生成されます。これらのイベントは、ディレクトリが正常に変更された後に初めてトリガーされます。

3.2.1.3 ワークフロー・イベント

ワークフローは、データの作成または変更のために使用される各ステップのセットを繰り返し実行できるよう定義したものです。ワークフロー定義は、アイデンティティ・システム内に作成および格納されます。これにより、ユーザーは必要時にワークフローを名前で参照し、Workflow Engineに処理するよう指示できます。ワークフロー・ステップごとに、イベントのペア(preとpost)が生成されます。preイベントによって、ステップの実行前に、イベント・ハンドラによるワークフロー・データの検査と変更が可能になります。postイベントによって、ステップの実行後に、イベント・ハンドラによるワークフロー・データの検査と変更が可能になります。また、ワークフロー・ステップでは、外部アクション・イベントの生成も行われます。

ワークフロー内のPreイベント、Postイベントおよび外部アクション・イベントでは、LDAPデータとテンプレート・オブジェクト・データの両方を処理できます。これが、LDAPデータのみを処理するアイデンティティ・システム・アプリケーションと異なる点です。テンプレート属性は、アイデンティティ・システムによりワークフロー・ステップに次のように完全修飾された形式で格納されます。

attribute.class.domain

詳細は、『Oracle Access Manager Administration Guide』のテンプレート・オブジェクトの構成に関する章を参照してください。

3.2.1.4 パスワード管理イベント

パスワード管理イベントは、外部検証フラグが有効化されているパスワード・ポリシーによって保護されたディレクトリ・ツリーのブランチに、ユーザーのパスワードを設定しようとする際に生成されます。パスワード管理イベントに関連するアクションは、パスワードの内容をカスタム・ビジネス・ルールに対してチェックするために使用されます。

パスワード・ポリシー作成の一端として、「外部的に指定された検証ルール」オプションを有効化することもできます。Oracle Access Managerによって、リクエスタに対してパスワード・ポリシーが適用されます。リクエスタにポリシーが適用されている場合、Oracle Access Managerによってこのフラグが設定されているかどうかがチェックされます。フラグが設定されている場合、Oracle Access Managerによってパスワード検証イベントが実行され、これにより、ユーザーが定義したアクションが実行されます。Oracle Access Managerよって、アイデンティティ・システムのロスト・パスワード管理アプリケーションのためのアイデンティティ・イベント・プラグインもサポートされています。oblixpppcatalog.lstファイルを構成する際、このアプリケーションの名前はlost_pwd_mgmtになります。

3.2.1.5 ロスト・パスワード管理

ロスト・パスワード管理機能に関連するイベントはsetChangedPassword、アプリケーション名はlost_pwd_mgmtです。サンプル・アプリケーション名、イベント名およびアクションを結合すると、lost_pwd_mgmt_setChangedPassword_preになります。

3.2.1.6 暗号化イベント

アイデンティティ・システムによって、独自の暗号化メソッドがいくつかの情報に適用されます。この情報の1つは、認証されたセッションのログインCookieなどのCookie情報です。このCookieの暗号化バージョンは、セッションが有効な間、ユーザーのブラウザに保持されます。2つ目の情報は、ロスト・パスワード管理に使用されるチャレンジ/レスポンスのペアのうちのレスポンス側です。チャレンジ・フレーズへのレスポンスとしてユーザーから出されるレスポンス・フレーズは、ディレクトリに暗号化して格納されます。パスワード情報は、ワークフローに組み込まれる際に暗号化されます。暗号化イベントは、アイデンティティ・システムでデータを暗号化する必要がある際、(アクションに実装された)ユーザー定義の暗号化アルゴリズムを呼び出すために使用されます。

Oracle Access Managerの暗号化技術をユーザー独自の暗号化技術に置換するには、アクションをカタログに追加して、これらのデフォルトの暗号化メソッドの一方、あるいは両方を置き換えます。たとえば、ワークフロー内のCookie、チャレンジ・レスポンス、パスワード・フィールドのデフォルトの暗号化スキームをこのメソッドに置換できます。

3.2.2 アクションのタイプ

アクションとはイベント・ハンドラのことです。より具体的には、開発者によって書かれた後、特定イベントへのレスポンスとして実行されるようにマスター管理者によって構成された外部ロジックの単位です。

アクションには、LIB、MANAGEDLIBおよびEXECの3つの形式があります。

アクションは、外部コンポーネントにアクセスすることなくタスクを実行したり、任意の利用可能なメカニズムを使用して、Webサービス、RDBMSサービス、ERPアプリケーションなどサード・パーティのアプリケーションとリソースにアクセスできます。

アイデンティティ・サーバーは、起動されると、アクションの構成カタログを読み込み、どのイベントにアクションがあるかという情報を把握します。イベントが発生すると、サーバーによって、関連付けられたアクションが実行されます。

3.2.2.1 LIBアクション

LIBアクションは、アイデンティティ・サーバーによってコールされる共有ライブラリ内の関数です。LIBアクションは、UNIXの共有ライブラリ、またはWindowsのDLLに格納されています。アクションの関数は、動的にロードされると、アイデンティティ・サーバーと同じプロセス領域内で実行され、サーバーに保持されているデータ・オブジェクトにAPI関数で直接アクセスします。

LIBアクションのために、アイデンティティ・サーバーは共有ライブラリまたはDLLを動的に開き、アクションが実装された関数を検索してコールします。

LIBアクションにはいくつかの利点があります。次のとおりです。

高速にロードされる: LIBアクションはコンパイルされて共有ライブラリに格納されているバイナリ・オブジェクトです。起動オーバーヘッドが比較的に小さくて済みます。

実行時に再使用可能: LIBアクションは1度ロードするのみです。その後仮想メモリーに残り、後続のコールに使用できます。

高パフォーマンス: LIBアクションはCまたはC++ソース・コードからコンパイルされたバイナリ・コード・モジュールであるため、高速に実行できます。高速とみなせるかどうかは、実行する機能によって変わってきます。

IDデータはオンデマンドで取得: LIBアクションは、簡単なGET/SET APIコールを使用してアイデンティティ・システムから現在のリクエスト、認証されたユーザーおよび他のサービスに関する大量のデータにアクセスできます。

スケーラブル: LIBアクションは、リクエストの処理時に繰り返しコールできるというシンプルな関数であるためオーバーヘッドが小さくなるので、通信量の多いアプリケーションでも高いスケーラビリティを示します。

LIBアクションの短所は次のとおりです。

サード・パーティ・コンポーネントからのサポートが限られている: LIBアクションはCまたはC++で作成されているため、RDBMSアクセス、XMLの解析と書式設定、ネットワーク・サービス、暗号化サービス、LDAPサービスなどの外部サービスにアクセスするために必要となる無償で利用可能なサード・パーティのAPIが比較的限られています。これらのサービスは、JavaとPERLの開発者コミュニティではいろいろな場所で入手可能です。

専門的知識が必要: LIBアクションの実装には、専門的なスキルが必要です。このため、コストが高くなる可能性があります。たとえば、WindowsとSolarisの環境に同時に同じアクションをデプロイする場合でも、両方のプラットフォームと開発環境におけるC/C++開発の専門知識が必要になります。

プラットフォーム依存ソース・コード: Solarisに共有ライブラリを作成およびビルドするために必要なステップが、Windows NTでのDLLビルドのためのステップと異なります。防御的コーディングの実装には、クロス・プラットフォームのソース・コードを確保する必要がある、またはマルチ・プラットフォームのデプロイに対して複数のソース・ツリーを保守する必要があります。

アイデンティティ・サーバーが失敗する可能性: LIBアクションのエラーによる例外を捕捉できなかった場合、アイデンティティ・サーバーが失敗します。アクションが予期せずメモリーのリークや破損を引き起こすと、アクションはアイデンティティ・システムのIDアドレス空間で実行されているため、サーバーではこれを検出しリカバリできないためです。このような問題はEXECアクションでは発生しません。EXECアクションはそれぞれ独自のアドレス空間で実行され、失敗はEXECアクションのみにとどまるためです。子プロセスが成功ステータスを戻さずに終了するため、サーバーは問題を検出できます。

3.2.2.2 MANAGEDLIBアクション

MANAGEDLIBアクションはWindows上のみで稼働します。MANAGEDLIBアクションは、任意の.NET言語で書くことができます。.NET言語とは、Microsoft Intermediate Language(MIL)コンパイラの存在する任意のソース用言語です。MIL命令が、Microsoft .NET共通言語ランタイム(CLR)によって実行されます。このランタイムによる実行には、Just-In-Time(JIT)コンパイラが使用されます。JITコンパイラは、MIL命令をネイティブのマシン命令にコンパイルします。MIL命令は1回コンパイルされると、動的メモリーに格納されます。このマネージ・コードの最初の実行時は、ヒット率が低めのため、パフォーマンスはあまり高くありません。

MANAGEDLIBアクション。

MANAGEDLIBアクションはLIBアクションに類似しています。LIBアクションと同様に、MANAGEDLIBアクションはメモリーにロードされます。MANAGEDLIBアクションの利点は、LIBアクションの利点とほとんど同じです。

さらに、MANAGEDLIBアクションには、マネージ・コードが持つ次のような利点があります。

  • 言語の選択: プラグインをVisualBasic、C#、Managed C++ (MC++)、JavaまたはPERLで記述できます。

  • 言語統合: 異なるソース言語からコンパイルされた複数のMILモジュールを1つのアセンブリすなわちプラグインとして合成できます。これによって、プラグイン開発者がプラグインを開発する際の言語選択の範囲が広がります。

  • メモリー管理のサポート: CLRではガベージ・コレクションが提供されるため、プラグイン開発者はメモリー管理作業の大部分をしないで済みます。メモリーが参照されなくなると、ガベージ・コレクタはメモリーをヒープに戻します。ただし、プラグイン開発者はオブジェクトへのダングリング参照がないことを確認する必要があります。ダングリング参照されている未使用メモリーは、ガベージ・コレクションを行われないためです。

  • .NETフレームワーク・サポート: .NET Framework SDKには、広範な機能が含まれています。これにより、プラグイン・コードでのサード・パーティ・サポートの必要性が少なくなります。

3.2.2.3 EXECアクション

EXECアクションは、アイデンティティ・サーバーによって実行されるスタンドアロンの実行可能プログラムです。各EXECアクションは独立した実行可能ファイルに格納され、独自のプロセス空間で実行されます。アイデンティティ・サーバーは、EXECアクションを処理する場合、新規の子プロセスを開始し、アクションのパラメータを渡してアクションの実行可能ファイルをロードします。入力はSTDINからアクションにストリーム入力し、出力はSTDOUTとプロセスの終了ステータスに出力されます。

EXECアクションの特性は次のとおりです。

  • アイデンティティ・サーバーとの通信は起動パラメータを通してのみ行われ、入力にはXMLストリームが、出力にはXMLストリームと終了ステータス・コードが使用されます。アイデンティティ・システムのデータにさらに詳細にアクセスするには、アイデンティティ・システムの他のクライアントと同様に、IdentityXMLを使用する必要があります。

  • また、アクションは、LDAPアイデンティティ・イベント・プラグインAPIのような他のAPIを使用して、ディレクトリ情報に直接アクセスできます。

  • スクリプティングされたEXECアクションの場合、アクションそのものは/usr/local/bin/perlなどのインタプリタで実行され、スクリプトそのものはコマンドライン・パラメータとして渡されます。

EXECアクションの利点は次のとおりです。

開発言語の選択: EXECアクションの開発者は、C、C++、Java、PERLまたはCスタイルのコマンドライン処理とstdio.h互換の標準I/O処理をサポートする任意の言語でコードを記述できます。

ラピッド・プロトタイピング: EXECアクションは、PERLなどのスクリプト言語を使用したラピッド・プロトタイピングまたはラピッド開発が可能です。

プラットフォーム非依存のコード: EXECアクションのソース・コードは、言語中立性を持つため、プラットフォームに依存しません。PERLとJavaで書かれた同じコードを、WindowsとUNIXのどちらでも実行できます。

Java互換: EXECアクションはJavaで実装できるため、Java APIのみを提供するサード・パーティのサービスにアクセスできます。

広範なサード・パーティのサポート: EXECアクションのためにアイデンティティ・サーバーがダウンすることはありません。失敗した場合、エンドユーザーにはエラー・レポートが表示され、アイデンティティ・サーバーによって他のリクエストへの対応が続けられます。

短所は次のとおりです。

スケーラビリティが低い: 各リクエストに対して新規の子プロセスが必要になるため、EXECアクションは通信量の多いアプリケーションへのスケーラビリティはあまり高くありません。

アイデンティティ・システム・データへのアクセスが限られている: EXECアクションは、実行時に、コマンドライン・パラメータから、またはSTDINに使用できる(静的)XMLストリームから入力を取得します。さらに他のアイデンティティ・システム情報への直接アクセスを提供するAPIはありません。追加情報に直接アクセスするには、アクションはIdentityXMLクライアントを実装し、別の接続を介してアイデンティティ・サーバーと通信する必要があります。

XMLパーサーが必要: EXECアクションは、入力にアクセスする際、最も単純なタスク以外のすべてのタスクを理解するためにXMLを解析する必要があります。つまり、受信した入力のXMLスキーマを理解するために埋込みパーサーが必要となります。これによって起動時間、メモリー・フットプリント、アクションの複雑さが増し、タスクの大部分では負荷が大きくなりすぎる可能性があります。

3.2.3 構成ファイル(カタログ)

アイデンティティ・システムでは、応答し合うアイデンティティ・イベント間のリンクと実行するカスタム・アクションを提供するために、構成ファイルoblixpppcatalog.lstを使用します。このファイルはカタログと呼ばれます。LIB、MANAGEDLIBおよびEXECのアクションについては、このファイルを次のディレクトリにインストールし、インストール後は移動禁止とする必要があります。

Identity_install_dir/identity/oblix/apps/common/bin


注意:

アイデンティティ・システムをインストールした際、インストール・ディレクトリをたとえば/usr/coreid/identityのように指定して作成しました。このディレクトリを使用しやすく省略してIdentity_install_Dirと表記します。

oblixpppcatalog.lstの各エントリは1行からなり、アイデンティティ・システム・イベントをアクションにリンクします。カタログ内の各行には、セミコロンで区切った最低5つのフィールド(apiVersionフィールドを使用する場合は6つのフィールド)を含める必要があります。各行はセミコロンで終わる必要があります。各フィールド内のデータ項目のリストは、カンマで区切ります。フィールドは空のままにもでき、その場合にはセミコロンが続くことになります。各フィールドの正確な内容は、アクション・タイプと応答するイベントの種類によって異なります。

LIBまたはMANAGEDLIBのエントリの一般的な形式は、次のとおりです。

actionName;actiontype;;path;funcname;apiVersion;

LIBとMANAGEDLIBのアクションでは、pathには相対パスとフルパスのいずれでも指定できます。

EXECエントリの一般的な形式は、次のとおりです。

actionName;actiontype;identityparam1,...;path;execparam1,...;apiVersion;

エントリ内のフィールドの間はセミコロン(;)で区切ります。各エントリは少なくとも5つのフィールドを含み、セミコロンで終わり、新規行(改行とライン・フィード)に続く必要があります。


注意:

このファイルでは、コメントの行を示すために特殊文字#が使用されます。この文字をLIBやEXECのエントリの一部として使用しないでください。たとえば、LIB funcname getbuilding#をコールしようとすると失敗します。このエントリでは、#以後がすべて無視されるためです。

次の表で、各フィールドについて説明します。各列をスクロールして読み、それぞれのアクション・タイプの内容を理解してください。

フィールド名 LIBアクションとMANAGEDLIBアクション EXECアクション
actionName

(必須)

フィールド1。アクション名。この名前には、アクションが応答するイベント・タイプ(および必要に応じて、イベント前、イベント中、あるいはイベント後のいずれのときにアクションを実行するか)をアイデンティティ・システムに通知する情報を指定します。 フィールド1。LIBアクションとMANAGEDLIBアクションについての説明と同じ。
actiontype

(必須)

フィールド2。使用するアクションのタイプに応じて、managedlibまたはlib(いずれも文字どおりのスペル)。 フィールド2。exec(文字どおりこのスペル)。
identityparam1,

. . .

(オプション)

フィールド3。このフィールドは常に空です。 フィールド3。EXECアクション専用。一連のグローバル・パラメータの名前(カンマ区切り)。これらのパラメータの表は、「グローバル・パラメータ」を参照してください。
path

(必須)

フィールド4。アクションを実装するLIBファイルまたはMANAGEDLIBファイルのロケーションと名前。 フィールド4。アクションを実装するEXECファイルのロケーションと名前。
funcname

(必須)

フィールド5。LIBアクションまたはMANAGEDLIBアクション用に共有ライブラリ内からコールする1つの関数の名前。 N/A
execparam

(オプション)

N/A フィールド5。EXECアクションへの1つ以上の入力パラメータ(カンマ区切り)。
apiVersion

(オプション)

フィールド6。このフィールドは空のままにします。製品の旧バージョン用に予約されています。 フィールド6。MANAGEDLIBアクションについての説明と同じ。

3.2.4 アクションを記述するための手引き

アクションを作成する手順は、次のとおりです。

3.2.4.1 タスク概要: アクションの記述

  1. 要件の割出し: アイデンティティ・システムでは戻せない結果を生成するために、アイデンティティ・システムのリクエストまたはワークフローのどちらの入力、結果または副作用に対して、検証または変更のいずれを行う必要があるかを調査します。

  2. イベントの選択: この選択は次によって決定します。

3.2.4.2 作成: データの作成

  1. タイミング: イベント発生時に、システムがアクションの目標とする状態にあるかどうか。

  2. パフォーマンス: パフォーマンスを最大化するために、目標とする結果を戻す、使用頻度が最も低いイベントを割り出します。

  3. 実行: このアクションを、アイデンティティ・システム・アプリケーションによるリクエスト処理の前(preイベント)に実行するか、後(postイベント)に実行するかを決定します。

  4. 記述: アクションを記述します。

  5. アクションの構成: マスター管理者は、次のアイデンティティ・イベント・プラグインAPIの構成カタログを編集する必要があります。

Identity_install_dir//identity/oblix/apps/common/bin/oblixpppcatalog.lst

管理者はカタログにエントリを入力し、特定のリクエストに対するアクションとそのパラメータを登録します。次に、管理者は、アイデンティティ・サーバーを起動するかPortal Insertを使用して、実行中のアイデンティティ・サーバーのカタログをリフレッシュします。

3.3 APIの動作

次の項では、アイデンティティ・システム・アプリケーション側から見た、アクションの検索および実行の方法について説明します。その後に続く項「アクションから見たアイデンティティ・システム・アプリケーション」では、アクションの視点から見て、何が発生していて、どのデータにアクセスできるのかについて説明します。

3.3.1 アイデンティティ・システム・アプリケーションから見たアクション

アイデンティティ・システムが起動するたびに、カタログがロードされます。アイデンティティ・システムの稼働中に、ファイルの内容を変更することはできますが、変更はファイルがリロードされて初めて有効となります。変更を有効化するには、アイデンティティ・システムを再起動するか、ブラウザで次のURLに接続します。

http://hostname:port/identity/oblix/apps/admin/bin/genconfig.cgi?program=flushCache&cacheType=ppp

LIBアクションとEXECアクションの場合: アイデンティティ・イベント・プラグイン(PPP)情報をアイデンティティ・システムからフラッシュすると、アクションを含む実行ファイルとDSOに関してシステムで記憶していたすべての情報が失われます。アイデンティティ・システムは、次回イベントを生成する際にカタログを再度読み取り、構成されているアクションと発生したイベントに応じて、リクエストごとにDSOのロードを開始します。

MANAGEDLIBアクションの場合: DSO(マネージ・コードの用語では、アセンブリまたはDLL)が1度デフォルトのアプリケーション・ドメインにロードされます。プラグイン開発者は、アセンブリを再度ビルドする場合、新規アセンブリ内のアクションが初回に起動された際にそのアセンブリがロードされるようアイデンティティ・サーバーを再起動する必要があります。

単一のイベントに対して複数のアクションを定義できます。複数のアクションを定義すると、すべてのアクションがカタログにあるとおりの順序で実行されます。この方法によって、1つのアクションの出力が次のアクションの入力になる、アクション・パイプラインをビルドできます。

ただし、アクションを起動する通常のイベントはユーザーのアクティビティにより引き起こされることに注意してください。開発したコードによってデータが処理され、出力がパイプラインのチェーンによって受け渡されている間、エンドユーザーは結果に対して待機しています。ユーザーが感知できるレスポンス時間の影響を、すべてのアクションを設計およびテストする際、考慮に入れる必要があります。特に、単一のイベントに対して複数のアクションが期待される場合には必要となります。また、複数のアクションのいずれかによってエラーが戻された場合、そのイベント・インスタンスのパイプラインの残りのアクションは実行されないことにも注意してください。

次のダイアグラムは、例となる3つのイベントをユーザー・マネージャ・アプリケーションのアクションで使用できるように構成するための方法を示しています。

workflowActivateイベントが、後処理時に実行する3つのカスタム・アクションとカタログ内で関連付けられているとします。

  • 新規にアクティブ化されたユーザーに関する情報を抽出するためにアクションを起動し、ユーザーをデフォルトの会社電子メール配信リストに追加します。

  • 組織に加わった新規ユーザーを歓迎して、事前に記述された電子メール・メッセージのテンプレートを、(大部分の場合、アイデンティティ・システムのデータに基づいて)該当するリストと個人に送信します。

  • 該当するユーザー情報を使用して外部会社の複数のデータベースを更新する、外部ビジネス・プロセスをトリガーします。これは、新規ユーザーの情報を表に出力して外部プログラムに取得させるアプリケーションと同じぐらい単純なものと言えます。

イベントのトリガー方法。

この例では、ユーザー・リクエストによってworkflowActivateイベントが生成されると、ユーザー・マネージャは、カタログを検索し、このイベントに前処理アクションが構成されていないことを確認して、XMLでのページの生成に進みます。次に、ユーザー・マネージャは、後処理アクションがないかをチェックして、updateDistLists、sendWelcomeMsgおよびupdateRDBMSの3つを見つけます。ユーザー・マネージャは、カタログをチェックして最初のアクションupdateDistListsがLIBアクションかEXECアクションかを確認します。このテストの結果によって、処理がこの後どのように続行されるかが異なってきます。

  • LIBアクションの場合: ユーザー・マネージャは、関数を含むDSOを動的にロードし(未ロードの場合)、アクション内で関数へのポインタを取得します。次に、ユーザー・マネージャは、関数を起動するイベント名と、アクションがユーザー・マネージャと対話するために使用するObPPPDataオブジェクトのポインタを入力引数として、関数をコールします。アクションは、必要に応じてObPPPDataメソッドをコールしてユーザー・マネージャに問合せを行い、タスクを実行します。タスクが完了すると、アクションの関数はステータス情報を戻します。イベントは、この情報を使用して自らの次の動作を決定します。

  • MANAGEDLIBアクションの場合: ユーザー・マネージャは、関数を含むDSOを動的にロードし(未ロードの場合)、IPPPDataインタフェースを実装するオブジェクトへのポインタを取得します。アイデンティティ・システムは、EventAPIオブジェクトを参照し、そのオブジェクトに対して、IPPPDataへの参照を入力パラメータとしてアクション・メソッドを起動します。EventAPIオブジェクトはシングルトンです。つまり、最初のリクエストによってオブジェクトがインスタンス化され、そのオブジェクトが後続のリクエストによって使用されます。アクションは、必要に応じてIPPPDataメソッドをコールしてユーザー・マネージャに問合せを行い、タスクを実行します。タスクが完了すると、アクションの関数はステータス情報を戻します。イベントは、この情報を使用して自らの次の動作を決定します。


    注意:

    マネージ・コードの用語では、DSOはアセンブリまたはDLLと呼ばれます。

  • EXECアクションの場合: 実行可能ファイルがユーザー・マネージャによって新規プロセスとして開始され、STDINストリームとSTDOUTストリームへの接続が行われます。コマンドライン引数のargv[]配列も作成されます。最初の引数は、引数の総数です。最後の引数は常に、EventXMLという固有のXML形式で提供されるカタログに指定された一連のアイデンティティ・システム・パラメータ(存在する場合)のデータです。中間にある引数はカタログ・ファイル内の各EXECパラメータ(存在する場合)に設定された値と一致します。ユーザー・マネージャは常に、リクエストの現在の状態を示すXMLデータを、EventXML形式で、STDINのアクションに送信します。アクションは引数を解析し、存在する場合にはSTDINを読み取り、タスクを実行します。このタスクには、ユーザー・マネージャから受信した情報を抽出および置換するためのXML解析が含まれる場合と含まれない場合があります。アクションは、完了時にオプションでXMLデータをSTDOUTに書き込めます。アクションでXMLデータを戻すのは必須ではありません。アイデンティティ・システムがデフォルトで、オリジナルのバージョンを解析後の形式で保持するためです。(データが大きい場合、追加の解析操作を行わないことをお薦めします。)


    注意:

    アクションでXMLデータを変更する場合、そのアクションにより、出力XMLを適切なXMLスキーマに準拠させる必要があります。処理するイベントに適したスキーマ・ファイルを検索する方法については、「イベントのアクションへの接続」を参照してください。

ユーザー・マネージャは、結果ステータス・コードとして、LIBアクション関数の戻り値か、またはEXECアクションを実行していた終了済の子プロセスの終了ステータスを受け取ると、次のように続行されます。

  • STATUS_PPP_OK: ユーザー・マネージャは、workflowActivate用に構成されたカタログで、次に続く後処理アクションを検索します。後処理アクションが見つかると、ユーザー・マネージャは、以前のアクションからの変更された可能性のあるXMLデータを入力引数として、後処理アクションの先行手順を再実行します。

  • STATUS_PPP_ABORT: アクションがエラーを示しています。この場合、ユーザー・マネージャでは、イベントの後続アクションに対しては存在チェックすら行われません。アクションからAPIを介して転送された情報はすべてエラーとして変換され、処理されます。一般に、この結果としてエラー・メッセージがユーザーに表示されるため、ユーザーは問題をレポートできます。

  • STATUS_PPP_WF_ASYNC: ワークフロー用。この結果により、非同期のアクション(大部分の場合、マニュアル)が完了するまで待機するようイベントが指示を受けます。これにより、たとえば、現在利用できていないデータベースが、ワークフローの再開前に更新されます。詳細は、「ワークフロー・イベント」を参照してください。

  • STATUS_PPP_WF_RETRY: ワークフロー用。このレスポンスによって、おそらく無効なデータのためにワークフロー・ステップが実行されなかったため、データの再入力が必要であることがイベントに通知されます。イベントは再試行数を1つ増やし、再起動されます。

前述の例において、workflowActivateには3つの後処理アクションがあります。この例は、1つのアクションから次のアクションにデータを渡しているため、パイプラインのように見えます。実際には、各アクションは、次のアクションがコールされる前にユーザー・マネージャに戻ります。すべてのアクションがSTATUS_PPP_OKを戻すと、ユーザー・マネージャはリクエストの処理を完了し、ページにXSLスタイルシートを適用して、生成したHTMLページをブラウザに戻します。

workflowDeactivateの前処理イベントまたは後処理イベントに対するアクションは構成されていないため、ユーザー・マネージャはアクションをコールせずにページを生成します。

workflowReactivate後処理イベントは、sendWelcomeBackMsgアクションをコールするよう構成されています。ユーザー・マネージャによってこの単一アクションがコールされ、出力にXSL処理が適用されてから、生成ページがユーザーに戻されます。


注意:

アクションは、現在のイベントに認識されているデータのみに直接アクセスできます。たとえば、ディレクトリにある詳細なユーザー情報にアクセスするには、アクションは、指定したタスクを完了するために十分な情報を得るために、IdentityXMLインタフェースなどの異なるメソッドを使用してアイデンティティ・システムと通信する必要があります。

前に示した図では、ユーザー・マネージャを例として使用していますが、イベントを生成する他のアイデンティティ・システム・アプリケーションも、アイデンティティ・イベント・プラグインAPIとまったく同様に動作します。

LIB、MANAGEDLIB、EXECのアクションの詳細な例は、を参照してください。サンプル・コードと構成用のカタログ・エントリも記載されています。

3.3.2 アクションから見たアイデンティティ・システム・アプリケーション

次の各項では、アイデンティティ・システムのアプリケーションとアクションの詳細を説明します。

3.3.2.1 LIBアクション

LIBアクションは、CまたはC++でのみ作成可能です。ただし、LIBアクションをJavaで作成する場合は、Java APIでC++関数をラップするJNIを記述してください。

3.3.2.2 LIBインタフェース

アイデンティティ・システムとのLIBアクションのインタフェースは、obpppdata.hファイルに含まれるObPPPDataクラスによって定義されます。このファイルのロケーションは「開発環境」を参照してください。ObPPPDataには、LIBアクションがアイデンティティ・システム・データにアクセスするために使用する5つのメソッドが定義されています。これらのメソッドは次のとおりです。

  • Get: このメソッドを使用して、指定されたパラメータの値(属性は複数値の場合があります)を、イベントをトリガーしたアイデンティティ・システム・アプリケーションから取得します。このメソッドによって、キーに一致する値の配列へのポインタが戻されます。キーは、イベントを処理するアプリケーションに認識されている任意の属性です。キーにはグローバル・パラメータの1つを指定することもできます。「グローバル・パラメータ」を参照してください。配列の最後のメンバーはNULLです。

    virtual const char * const *Get( const char *key) const;
    
    

    戻り値に対するメモリーの割当てと解放は、アイデンティティ・システム側で行う必要があります。アクションをトリガーするイベントに有効でないパラメータに対する値をリクエストすると、NULL値が戻されます。

  • Set: このメソッドを使用して、指定パラメータの値をアイデンティティ・システム・アプリケーションに送信されるよう設定します。イベントに有効なパラメータについてのみ、値を設定してください。

    virtual int Set(const char *key,

    const char * const *value) = 0;

    keyは、設定するパラメータを示します。valueは、使用する値の配列です。配列の最後のメンバーにはNULLを指定する必要があります。

    入力パラメータの値に対するメモリーの割当てと解放は、API開発者側で行う必要があります。

    設定が成功した場合、アイデンティティ・システムによって1が戻されます。成功しなかった場合は、0が戻されます。

  • Receive: このメソッドを使用して、アイデンティティ・システム・アプリケーションからイベント・データをXML文字列としてリクエストし、受け取ります。このXML文字列内でデータを検索するために、文字列の構造を理解する必要があります。「XMLの使用方法」と『Oracle Access Managerカスタマイズ・ガイド』のPresentationXMLに関する章を参照してください。

    virtual const char *Receive() const = 0;
    
    
  • Send: このメソッドを使用して、イベント・ページの置換コンテンツをアイデンティティ・システム・アプリケーションにXML文字列として送信します。一般に、このコンテンツはEventXMLで、この文字列からアイデンティティ・システム・アプリケーションは必要な情報を抽出します。ただし、後処理アクションの場合は、コンテンツはPresentationXMLであると予想されます。このPresentationXML文字列は、後処理アクション以外の場合にアイデンティティ・システム・アプリケーションがユーザーにHTMLページを生成するために使用していた、またはこのアクションがパイプラインの一部の場合には次のアクションに渡していたはずの出力に、完全に取ってかわります。新規のコンテンツは、copyrightなどのテキスト・メッセージが追加されるなど少しだけ変更されるか、非常に異なるデータを含む場合があります。

    virtual void Send(const char *data) = 0;
    
    

    送信されるXMLデータ文字列は、それを受信するアプリケーションによって予期されるスキーマと一致する必要があります。そのためには、本番環境でアクションを使用する前に、XMLエディタでXMLデータをスキーマに対して検証することをお薦めします。

  • SetResultString: このメソッドを使用して、アイデンティティ・システム・アプリケーションによってユーザーに表示される結果の文字列の内容を設定します。テキストが実際にどのように表示されるかは、アクションが応答するイベントによって異なります。

    virtual void SetResultString(const char *str) = 0;
    
    

    strには、表示するテキストを指定します。


    注意:

    postイベントで戻されるデータはPresentationXML形式になるため、このメソッドはpostイベントには使用できません。エラーを表示する場合、PresentationXMLに生成するのは開発者側の責任です。

3.3.2.3 ロード動作

LIBアクションのための動的共有オブジェクト(DSO)は、最初に必要となったときにアイデンティティ・システムのアドレス空間にロードされ、保持されます。新バージョンのDSOをアイデンティティ・システムの稼働中に生成およびインストールすることはできますが、新しいDSO内の変更されたアクションをロードするには、アイデンティティ・システムを停止または起動するか、あるいは「構成ファイル(カタログ)」に記載されたURLを使用してロード済のカタログをフラッシュする必要があります。構成ファイルをフラッシュすると、変更されたアクションは、対応するイベントが次回発生したときにリロードされます。

LIBアクションの関数は必要になったときにアイデンティティ・システム・アプリケーションにロードされ、アプリケーションによって直接実行されます。このため、WindowsプラットフォームではOracle提供のインタフェース・ライブラリと、UNIXではランタイム共有ライブラリそのものと、それぞれリンクする必要があります。Windows用ライブラリのロケーションについては、「開発環境」を参照してください。

3.3.2.4 LIBの例

LIBコードの例は、次のディレクトリにインストールされます。

Identity_install_dir/oblix/usupported/ppp/ppp_dll

の項にこのコード例があります。

3.3.2.5 MANAGEDLIBアクション

MANAGEDLIBアクションは、Microsoft .NET Frameworkによってマネージ・コード用にサポートされている任意の言語(Visual Basic、C#、C++を含む)で記述できます。

3.3.2.6 MANAGEDLIBインタフェース

アイデンティティ・システムへのMANAGEDLIBアクションのインタフェースは、IPPPDataインタフェースに定義されています。ヘッダー・ファイルのロケーションについては、「開発環境」を参照してください。ヘッダーはMC++で記述されています。IPPPDataインタフェースは他の.NET言語とは構文的に異なりますが、同じように動作します。つまり、セマンティクスは同じです。

IPPPDataには、MANAGEDLIBアクションがアイデンティティ・システム・データにアクセスするために使用する5つのメソッドが定義されています。これらのメソッドの定義は、LIBアクションの定義と類似しています。

  • Get: 指定されたパラメータ(引数key)の値を、イベントをトリガーしたアイデンティティ・システム・アプリケーションから取得します。

    String * Get( String * key ) __gc[];
    
    
  • Set: 指定パラメータ(引数key)の値をアイデンティティ・システム・アプリケーションに送信されるよう設定します。イベントに有効なパラメータについてのみ、値を設定してください。

    int Set( String * key , String * value __gc[] );
    
    
  • Receive: このメソッドを使用して、アイデンティティ・システム・アプリケーションからイベント・データをXML文字列としてリクエストし、受け取ります。このXML文字列内でデータを検索するために、文字列の構造を理解する必要があります。「XMLの使用方法」を参照してください。『Oracle Access Managerカスタマイズ・ガイド』のPresentationXMLに関する章も参照してください。

    String * Receive( );
    
    
  • Send: このメソッドを使用して、イベント・ページの置換内容をアイデンティティ・システム・アプリケーションにXML文字列として送信します。

    void Send( String * data );
    
    

    送信されるXMLデータ文字列は、それを受信するアプリケーションによって予期されるスキーマと一致する必要があります。そのためには、本番環境でアクションを使用する前に、XMLエディタでXMLデータをスキーマに対して検証することをお薦めします。

  • SetResultString: このメソッドを使用して、アイデンティティ・システム・アプリケーションによってユーザーに表示される結果の文字列の内容を設定します。テキストが実際にどのように表示されるかは、アクションが応答するイベントによって異なります。

    void SetResultString( String * str );
    
    

    strには、表示するテキストを指定します。


    注意:

    postイベントで戻されるデータはPresentationXML形式になるため、このメソッドはpostイベントには使用できません。エラーを表示する場合、PresentationXMLに生成するのは開発者側の責任です。

3.3.2.7 MANAGEDLIBのロード動作

DSO(マネージ・アセンブリまたはDLL)は、一度デフォルトのアプリケーション・ドメインにロードされます。これはアイデンティティ・システムのプロセスの一部です。プラグイン開発者は、アセンブリを再度ビルドする場合、新規アセンブリ内のアクションが初回に起動された際にそのアセンブリがロードされるようアイデンティティ・サーバーを再起動する必要があります。

3.3.2.8 MANAGEDLIBの例

MANAGEDLIBコードの例は、次のディレクトリにインストールされます。

Identity_install_dir\oblix\unsupported\ppp\dotnet\managedcplusplus

また、の項に記載されています。

3.3.2.9 MANAGEDLIBアクション

Windowsベースのマネージ・コードを使用して、Visual Basic、C#、C++、およびマネージ・コードを使用するその他任意の言語で、MANAGEDLIBアクションを記述できます。マネージ・コードは、MANAGEDLIBアクションにのみ適したコードです。EXECアクションには不適です。これは、MANAGEDLIBアクションがメモリーにロードされるためです。

3.3.2.10 EXECアクション

EXECインタフェース: 実行可能ファイルは個別プロセスとして実行され、アイデンティティ・システムとアドレス空間を共有しません。

アイデンティティ・システムと実行可能ファイル間で送受信されるデータは、アイデンティティ・システムにより、カタログ・エントリに指定された実行可能ファイルとアイデンティティ・システムの各パラメータに基づいて決定されます。次に、アクションは、イベントを示すXMLデータとコマンドライン引数のセットをSTDINから受け付けます。EXECアクションによってステータスと、オプションでXMLデータがSTDOUTに戻されます。このように正常に行われた場合の動作を次に示します。

EXECアクション。

コマンドライン引数のセットは、固定した論理構造を持っています。たとえば、コマンドライン・パラメータのargv[]配列について考えてみます。この配列の最初のメンバーは、引数の総数です。最後の配列メンバーは常に、EventXML形式で必ず提供されるイベントのカタログ・エントリに指定された一連のアイデンティティ・システム・パラメータ(存在する場合)のデータです。(これらはLIBアクションに利用可能な一連のパラメータと同じものです。パラメータの完全なリストは、「グローバル・パラメータ」を参照してください。)中間にある引数は、イベントのカタログ・エントリのEXECパラメータ(存在する場合)に設定された値です。EXECパラメータは、EXECアクションの動作を制御するためのユーザー定義命令です。

アクションに送信され、アクションから戻されるXMLデータの形式は、イベントのタイプによって異なります。多くの場合、STDINデータとSTDOUTデータはともにEventXML形式となります。例外は、後処理イベントです。後処理イベントは、「PreイベントとPostイベント」での説明のとおり、常にPresentationXMLを戻します。

EXECアクションはLIBと同じデータを取得して戻すことが可能ですが、通常、XMLデータの解析を必要とする、LIBより複雑な方法でそれを行います。LIBとの等価物は次のとおりです。

  • EXEC版のGet: 目的の値を取得するには、EventXML文字列またはPresentationXML文字列内の属性名と値をこの順に指定します。

コマンドラインの最後の引数として、EventXML形式であるグローバル・パラメータの値を指定します。

  • EXEC版のSet: 完全なEventXML文字列またはPresentationXML文字列、各XML内の属性名、値をこの順に指定する必要があります。

  • EXEC版のReceive: これは、イベントに対するEventXMLまたはPresentationXML文字列で、EXECには常にSTDINから入力します。

  • EXEC版のSend: これは、アクションがオプションでSTDOUTに戻すEventXMLまたはPresentationXMLです。

  • EXEC版のSetResultString: ObResultStringを使用してObParamを指定し、その値としてメッセージ文字列を指定します。

3.3.2.11 ロード動作

(キャッシュされている)LIBアクションとは異なり、EXECアクションは使用されるたびにファイル・システムを使用して新規に実行されます。つまり、毎回新バージョンに置換されます。新バージョンは、対応するイベントが次回トリガーされるときに実行されます。

3.3.2.12 EXECの例

EXECコードの例は、次のディレクトリにインストールされます。

Identity_install_dir/oblix/unsupported/ppp/ppp_exec

3.3.2.13 グローバル・パラメータ

グローバル・パラメータの特定のセットを取得できます。LIBアクションは、Getメソッドを使用して、対話式でこれらのパラメータの値を取得します。EXECアクションは、パラメータ・リストに1つ以上のパラメータ名を指定することによって、値を取得します。いずれの場合も、開発者は、次の表にリストされている、事前定義された固定値パラメータ名(キーとも呼ばれる)を指定します。記載のように、この表中のパラメータ名(すべて大文字)を、ObRequestまたはObEnvを前に付けて使用してください。

ユーザーIDのキーの名前 データの説明
ObRequest.

REMOTE_ADDR

クライアントのIPアドレス。たとえば、666.777.888.999。リクエストを行うユーザーのIPアドレスです。
ObRequest.

REMOTE_HOST

クライアントのDNSアドレス(たとえば、www.foo.com)。
ObRequest.

REMOTE_PORT

クライアント・ホストがリスニングするポートの番号。
ObRequest.

REMOTE_USER

HTTPの認証を受けるユーザーの名前。
ObRequest.

HTTP_USER_AGENT

クライアントのブラウザの名前(たとえば、Mozilla/4.07)。
ObRequest.

OBLIX_AUTH_USER

Oracle Access Managerの認証を受けるユーザー。
ObRequest.

TARGET_UID

ターゲット・エントリのUID。
ObRequest.

<any requestInfo parameter>

requestInfoパラメータは、表示されるページのURL内で、デリミタ$または&の前にある値。
ObEnv.

INSTALL_DIR

アイデンティティ・サーバーのインストール・ディレクトリ。

たとえば、LIBまたはMANAGEDLIBアクション内からリクエストを行っているユーザーの名前を取得するには、次の値を指定します。

currentuser = Get("ObRequest.OBLIX_AUTH_USER")

このEXEC版のリクエストに対応するカタログ・エントリは次のようになります。

userservcenter_view_pre;exec; ObRequest.OBLIX_AUTH_USER; ../../../unsupported/ppp/ppp_exec/pppexectest; someinstruction;

3.3.3 XMLの使用方法

内容は次のとおりです。

3.3.3.1 EventXMLの形式

EventXMLは、LIB、MANAGEDLIB、EXECアクションでの使用が想定された標準の形式を提供します。EventXMLのスキーマは、次のようになります。

    <?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.oblix.com/"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.oblix.com/" elementFormDefault="qualified">
           <xs:element name="ObEventParams">
             <xs:complexType>
             <xs:choice minOccurs="0"
                  maxOccurs="unbounded">
                  <xs:element name="ObParamList"
                  minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                       <xs:sequence>
                         <xs:element ref="ObParam"
                           maxOccurs="unbounded"/>
                         </xs:sequence>
                         <xs:attribute name="name"
                         type="xs:string" use="required"/>
                       </xs:complexType>
                     </xs:element>
                     <xs:element ref="ObParam" minOccurs="0"
                         maxOccurs="unbounded"/>
             </xs:choice>
             </xs:complexType>
           </xs:element>

<xs:element name="ObParam">
             <xs:complexType>
               <xs:sequence>
                   <xs:element name="ObValue" type="xs:string"
                     minOccurs="0" maxOccurs="unbounded"/>
                   </xs:sequence>
                   <xs:attribute name="name" type="xs:string"
                   use="required"/>
                 </xs:complexType>
</xs:element>
</xs:schema>

例をあげます。次のようなEXECアクションのカタログ・エントリがあるとします。

userservcenter_view_pre;exec;
ObRequest.cn,ObRequest.sn; ../../../unsupported/ppp/ppp_exec/pppexectest; execparam;

この例では、アイデンティティ・システムによってユーザー・マネージャ(userservcenter)で個人プロファイル・ページ(view)が生成される前に(pre)、EXECアクションpppexectestが起動されるよう指定されています。cnパラメータとsnパラメータの情報がリクエストされています。実行可能ファイルのパラメータexecparamは、実行可能ファイルの最初のコマンドライン引数として指定する必要があります。

次のリストでは、EXECアクションに渡すコマンドラインの最後の引数として指定したEventXMLを示します。リクエストされたパラメータの数だけ、ObParamのインスタンスがあります。

<?xml version="1.0" encoding="UTF-8"?>
<ObEventParams
xmlns="http://www.oblix.com/">
<ObParamList name="ObRequest">
<ObParam name="cn">
<ObValue>John Smith</ObValue>
</ObParam>
<ObParam name="sn">
<ObValue>Smith</ObValue>
</ObParam>
</ObParamList>
</ObEventParams>

3.3.3.2 PresentationXMLの形式

アイデンティティ・システムでは、ユーザーはサイトに依存する要件を満たせるように画面の外観とコンテンツを変更できるため、PresentationXMLのコンテンツには高い可変性があります。XMLのコンテンツと構造の説明は、『Oracle Access Managerカスタマイズ・ガイド』のPresentationXMLに関する章を参照してください。

3.3.3.3 XMLの解析

EventXMLまたはPresentationXMLを使用するには、開発者は、XMLデータ・ストリームを解析し、データを実際にGet(取得)できるストリーム内の取得元となるポイントや、データを実際にSet(設定)できる挿入ポイントを検索できる必要があります。

ここでは、開発者向けのこのようなパーサーのプログラミング方法については説明しません。ただし、一連のサンプルが次のフォルダにあります。

Identity_install_dir/oblix/unsupported/ppp/parser_test

これらのサンプル・ファイルのリストについては、「パーサーのファイル例」を参照してください。

これらのファイルでは、開発者がフリーウェアのApache XMLパーサー、XERCESを使用していることが前提とされています。このソース・コードは次から入手できます。

http://xml.apache.org/

EventXML文字列とPresentationXML文字列のコンテンツは技術的には予測可能ですが、どのイベントがどのアプリケーションで発生しているかによってきわめて多様に変化します。推奨する方法は、希望するアプリケーションとイベントの組合せに対してXMLストリームを戻すアクションを設定し、ファイルでストリームを取得することです。次に、その情報を操作するアクションをコーディングします。この方法は、特にストリームがきわめて多様なPresentationXML情報の場合に後処理イベント用のアクションを作成するために適しています。

3.4 APIでのイベント処理

5つのイベント・タイプのそれぞれについて、次のことを説明します。

内容は次のとおりです。


注意:

イベントの詳細は、「イベントのタイプ」を参照してください。すべてのイベント・タイプで、LIB、MANAGEDLIBおよびEXECの各アクションがサポートされています。

3.4.1 イベント・ハンドラの初期化関数と停止関数

LIBアクションとMANAGEDLIBアクションについては、前後処理(PPP)によってイベント・ハンドラの初期化と停止のための関数が用意されています。これらの初期化関数と終了関数は、PPPライブラリがロードまたはリロードされるたびにコールされます。

MANAGEDLIBアクションについては、EventAPIクラスのシングルトン・オブジェクトを定義する必要があります。その場合、コンストラクタがDSOのロード時に起動されます。デストラクタは、停止時にデフォルトのアプリケーション・ドメインがアイデンティティ・システム・プロセスからアンロードされる際にコールされます。初期化コードはこのクラスのコンストラクタ内に、停止コードはデストラクタ内に配置する必要があります。これらは、LIBアクションとMANAGEDLIBアクションに付属のInit関数とTerm関数に取ってかわります。

グローバルな初期化とクリーンアップは、次の各関数内でのみ実行する必要があります。

3.4.1.1 ObInitEventAPI ( )

LIBアクションの場合、DSOがロードされるとObInitEventAPI ()関数がコールされます。この関数によって、次に示すように、構成ファイルの読取りとログ・ファイルの作成など、グローバルな初期化のすべてが行われます。

unsigned int OBLIX_DLLEXPORT ObInitEventAPI (void)

この関数は、スレッド・セーフな方法でコールされるよう保証されています。

この関数がプラグインに存在する場合、アイデンティティ・システムはプラグインがロードされた後でこの関数をコールします。

3.4.1.2 戻り値

この関数は、obppp.hファイルで定義された次の2つのレスポンス値のいずれかを戻します。

  • STATUS_PPP_OK: 成功の場合に関数が戻す結果です。この関数結果は、関数がエラーなしで終了したことをアプリケーションに通知するものです。

  • STATUS_PPP_ABORT: 失敗の場合に関数が戻す結果です。この関数結果は、関数がエラーのために実行を終了できなかったことをアプリケーションに通知するものです。プラグインへの後続のコールは行われません。

3.4.1.3 ObTermEventAPI ( )

LIBアクションの場合、DSOがアンロードされるとObTermEventAPI ()関数がコールされます。この関数は、次に示すとおり、すべての割当てメモリーの解放やオープン済ファイルのクローズなど、クリーンアップ・アクティビティを行います。

unsigned int OBLIX_DLLEXPORT ObTermEventAPI (void)

この関数は、スレッド・セーフな方法でコールされるよう保証されています。

この関数がプラグインに存在する場合は、アイデンティティ・システムが停止時にこの関数をコールします。

3.4.1.4 戻り値

このアクションによって、pppdlltest.cppファイルで定義された次の値が戻されます。

STATUS_PPP_OK: 関数はこの結果を戻すことで、関数がエラーなしで終了したことをアプリケーションに通知します。

STATUS_PPP_ABORT: 関数はこの結果を戻すことで、エラーが発生したことをアプリケーションに通知します。

3.4.2 PreイベントとPostイベント

内容は次のとおりです。

3.4.2.1 カタログ・エントリ

このイベント・タイプについて、LIBアクションまたはMANAGEDLIBアクションに対するカタログ内のエントリの形式は次のとおりです。

actionName;lib;;libname;libfuncname;apiVersion;

EXECアクションに対するエントリの形式は次のとおりです。

actionName;exec;NPparam1,...;execname;execparam1,...;apiVersion;

各エントリ内の記号に注意してください。フィールドはセミコロンで区切られます。フィールド内のアイテムのリストはカンマで区切られます。エントリはセミコロンで終了します。フィールドは空にもできます。次の表には、各フィールドの詳細が説明されています。

フィールド名 説明
actionName(グループ・マネージャ、組織マネージャ、ユーザー・マネージャの各イベントのアクション名) 必須。ここには値をAPPNAME_EVENTNAME_PPPTYPEの形式で入力します。3つの部分に区切るためにアンダースコアを使用します。

APPNAMEはアイデンティティ・システムのアプリケーション名です。有効なアプリケーション名は次のとおりです。

groupservcenter: グループ・マネージャを表します。

objservcenter: 組織マネージャを表します。

userservcenter: ユーザー・マネージャを表します。

EVENTNAMEは、付録C「アイデンティティ・イベント」に記載の、APPNAMEアプリケーションで使用可能なイベントの1つです。

PPPTYPEは次のどちらかの値です。

pre: アクションが、イベントの前に実行される前処理アクションであることを意味します。

post: イベントの後に発生する後処理アクションを意味します。

(他のフィールド) 「構成ファイル(カタログ)」の説明を参照してください。

次に、LIBアクションのカタログ・エントリの例をいくつかあげます。ここに示した例とそれに続く項にある例では、このマニュアルを見やすくするため、ファイル・エントリは、セミコロン・デリミタで改行されて示されています。実際のファイルでは、コンテンツはすべて1行に入力する必要があります。また、サンプル・アクションのほとんどに対するソースが、アイデンティティ・システム・インストールの一部として提供されています。「開発環境」を参照してください。

 userservcenter_view_pre;lib;;
../../../unsupported/ppp/ppp_dll/libppp_dll.dll;
PreProcessingTest;;

MANAGEDLIBアクションのカタログでは、エントリは次のようになります。

 userservcenter_view_pre;managedlib;;
c:\unsupported\ppp\ppp_dll\libppp_dll.dll; PreProcessingTest;;

この例では、個人プロファイル・ページ(イベント=view)がユーザー・マネージャ(アプリケーション=userservcenter)によって生成される前に、ppp_dll.dllライブラリにあるPreProcessingTestアクション関数を実行するように指定しています。ファイル・タイプがlibであるため、これは関数によって実装されたLIBアクションです。つまり、アクションを実行する前に、DSOをロードし、DSO内から関数を特定する必要があります。

unsupportedディレクトリにあるこのサンプル・アクションでは、リクエストするuid値を次のDNに変更しています。

cn=Pick Carli,ou=Customer10K1,ou=Customers,o=Company,c=US

ユーザーがユーザー・マネージャのプロファイル・ページをリクエストすると、リクエストされたuidに関係なく、Mr. Smithのプロファイルが常に表示されます。

userservcenter_view_post;lib;; ../../../unsupported/ppp/ppp_dll/ppp_dll.dll;
PostProcessingTest;;

この例では、ppp_dll.dllのPostProcessingTestアクション関数がユーザー・マネージャの個人プロファイル(view)ページの生成後(post)に起動されるよう構成されます。unsupportedディレクトリにあるこのサンプル・アクションでは、プロファイル・ページではなくメッセージが強制的に表示されます。

カタログ・エントリの他の例は、次のデフォルトのカタログ・ファイルを参照してください。

Identity_install_dir/oblix/apps/common/bin/oblixpppcatalog.lst

3.4.2.2 インタラクション・メソッド

Get

操作 ユーザーIDのキーの名前 データの説明
GET <attribute name> LIBアクションの場合、表示の生成に使用するXMLデータ内の名前付き属性に入力された各値を保持する、NULLで終了する配列を戻します。マネージ・コードの場合、値の列挙が可能なベース型System.Arrayのオブジェクトを戻します。

Set

操作 ユーザーIDのキーの名前 データの説明
SET <attribute name> 表示の生成に使用するXMLデータ内の名前付き属性に値を設定します。
SET ObRequest.

<any requestInfo parameter>

表示されるページのURL内で$または&の前にあるすべてのRequestInfoパラメータに対して単一の値を設定します。

Receive

このリクエストへのレスポンスとして受信されるXMLデータは、アクションがpreかpostかによって、異なる2つの形式のどちらかを取ります。「XMLの使用方法」の説明のとおり、事前アクションはEventXML形式のデータを受信します。『Oracle Access Managerカスタマイズ・ガイド』のPresentationXMLに関する章の説明のとおり、後処理アクションは、PresentationXML形式のデータを受信します。


注意:

事前アクションの場合、モニタされるイベントが属性の変更を可能にするものである場合にのみ、EventXMLに値が含まれます。

Send

アプリケーションに戻すXMLデータは、受信されるXMLタイプと同じにする必要があります。アプリケーションに送信するデータは、各XMLタイプのデータの公式スキーマに準拠する必要があります。準拠しない場合、データは拒否されます。「パーサーのファイル例」の項に、アイデンティティ・システムのインストールに含まれるいくつかのパーサー・ファイルがリストされています。これらのパーサー・ファイルは、XMLエディタによるデータの検証に使用できます。

SetResultString

このメソッドから戻される文字列は、アイデンティティ・システム・アプリケーションによって表示されます。

戻り値

アクションは、Obppp.hファイルで定義された次の2つのレスポンス値のいずれかを戻します。

  • STATUS_PPP_OK: 成功レスポンス。アクションは、エラーなしで終了したことをアプリケーションに通知するために、この値を送信します。値 = 0x00h。

  • STATUS_PPP_ABORT: この戻り値は、エラーが発生したことを意味します。値 = 0x01h。

レスポンス値を正常に戻せないと、オペレーティング・システムがかわりにデフォルトの戻り値を戻すため、アプリケーションの動作が予測できなくなります。

3.4.3 OnChangeイベント

内容は次のとおりです。

3.4.3.1 カタログ・エントリ

このアクション・タイプに対するカタログのエントリは、actionName以外は前処理イベントと後処理イベントのエントリと同じです。

フィールド名 説明
actionName(OnChangeイベントのアクション名) 必須。ここには値をAPPNAME_STRUCTURALCLASSNAME_onchangeの形式で入力します。

APPNAMEはアイデンティティ・システムのアプリケーション名です。

STRUCTURALCLASSNAMEは、値の変更が監視される属性を含む構造化クラスの名前です。属性が補助クラスに属する場合は、その補助クラスが関連付けられている構造化クラスの名前になります。

onchangeは、この文字のとおりのアクション・タイプを指定しています。

(他のフィールド) 「構成ファイル(カタログ)」の説明を参照してください。

このイベントは、ディレクトリが正常に変更された後に初めてトリガーされます。

次に例を示します。

userservcenter_inetOrgPerson_onchange;lib;;
..\..\..\unsupported\ppp\ppp_dll\ppp_dll.dll;
uscOnChange;;

この例では、アクションuscOnChangeが、inetOrgPersonクラスまたはそれに関連付けられた補助クラスのいずれかに属する属性に対する、イベントによるあらゆる変更を監視するように指定しています。

3.4.3.2 インタラクション・メソッド

Get

操作 ユーザーIDのキーの名前 データの説明
GET <attribute name>.ObOldValue 属性の古い値。
GET <attribute name>.ObNewValue 属性の新規の値。
GET <attribute name>.ObChangeType 行われた変更のタイプ。

可能な値:

OB_ADD: 新規の値が追加されました。

OB_MODIFY: 既存の値が変更されました。

OB_DELETE: 既存の値が削除されました。

OB_NOCHANGE: 値は変更されませんでした。


Set

このメソッドはOnChangeイベントではサポートされません。

Receive

Receive()は、アイデンティティ・システムからデータを取得するために使用します。XMLは、前処理イベントと後処理イベントの場合と同様の方法で受信できますが、形式はEventXMLのみです。

Send

Send()メソッドは、アイデンティティ・システムにデータを送信するために使用します。onChangeイベント・ハンドラは、アイデンティティ・システム・アプリケーションのプロファイル・ページのデータ変更操作が終了すると、コールされます。onChangeイベント・ハンドラに対して、Send()メソッドを使用して、変更操作終了後に画面に表示するメッセージを設定します。Send()メソッドのコールは、EVENTXML形式で送信する必要があります。

Send()メソッドは、アイデンティティ・システムにデータを戻すために使用されます。Send()は、onChangeイベントに対して、操作終了後に表示するメッセージを設定するためにのみ使用できます。これと同じ結果は、SetResultString()コールを使用して実現することもできます。

SetResultString

このメソッドから戻される文字列は、アイデンティティ・システム・アプリケーションによって表示されます。

3.4.3.3 戻り値

アクションは、Obppp.hファイルで定義された次の2つのレスポンス値のいずれかを戻す必要があります。

  • STATUS_PPP_OK: 成功レスポンス。アクションは、エラーなしで終了したことをアプリケーションに通知するために、この値を送信します。値 = 0x00h。

  • STATUS_PPP_ABORT: この戻り値は、エラーが発生したことを意味します。値 = 0x01h。

レスポンス値を正常に戻せないと、オペレーティング・システムがかわりにデフォルトの戻り値を戻すため、アプリケーションの動作が予測できなくなります。

3.4.4 ワークフロー・イベント

内容は次のとおりです。

3.4.4.1 カタログ・エントリ

カタログでは、ワークフロー・エントリには、前処理イベントや後処理イベントのエントリと同じ形式が使用されます。また、エントリ内のフィールドを説明する表は、actionNameフィールドを除いて同じになります。ワークフロー・エントリのフィールドのうち、すべてのエントリと共通するフィールドの形式と要件の説明は、「構成ファイル(カタログ)」を参照してください。

フィールド名 説明
actionName(ワークフローのアクション名) ワークフローによってトリガーされるイベントには、次の形式を使用します。

WORKFLOW-DEFINITION-ID_STEP-DEFINITION-NUMBER_PPPTYPE: 3つの部分に区切るためにアンダースコアを使用します。

WORKFLOW-DEFINITION-IDは、ワークフローにラベルを付けるための一意の識別子です。ワークフローのDNは、ワークフロー定義ビューに表示されます。詳細は、『Oracle Access Manager Administration Guide』を参照してください。

STEP-DEFINITION-NUMBERは、ワークフローにおけるステップの番号です。

PPPTYPEは次の3つの値のいずれかです。

preaction: ワークフロー・ステップの前に実行する前処理アクションです。

externalaction: ワークフロー・ステップの一部として発生するアクションです。ワークフローは、このアクションが終了するまで待機してから実行を再開します。

postaction: ワークフロー・ステップ後に実行する後処理アクションです。

(他のフィールド) 「構成ファイル(カタログ)」の説明を参照してください。

次に、oblixpppcatalog.lstカタログ・ファイルのワークフロー・イベント・エントリの例を示します。

63f004504f83455b924133acd0ef2e87_3_externalaction;
lib;;../../../unsupported/ppp/ppp_dll/libppp_dll.so;
WorkflowExtActionTest;;

この例では、IDが63f004504f83455b924133acd0ef2e87のワークフローのステップ3で、外部アクション(externalaction)としてWorkflowExtActionTestをコールしています。

例: ワークフロー・ステップ後の後処理アクションとしてのログ出力のコール

次に、別のカタログ・エントリ例を示します。この例では、ワークフローのステップ1の実行終了後に、ログ出力アクションがコールされます。ワークフローID番号(2e22c064723e4030a05b437e059fe4d6)を使用して、このステップを含むワークフローを指定します。MS WindowsプラットフォームとUNIXプラットフォームの両方用の完全なエントリを次の各段落で示します。

Windowsの場合

MS Windowsの場合のoblixpppcatalog.lstエントリは次のとおりです。

2e22c064723e4030a05b437e059fe4d6_1_postaction; exec;uid;c:\j2sdk1.4.1_01\bin\java.exe; —classpath C:\ana\samples\bin Logger;;

  • actionName: 2e22c064723e4030a05b437e059fe4d6_1_postaction

    この例のactionNameの各部分について、次に説明します。

    • WORKFLOW-DEFINITION_ID

    • 2e22c064723e4030a05b437e059fe4d6

    • STEP-DEFINITION_NUMBER

      1

    • PPPTYPE

      postaction

  • actionType: exec

  • identityparam1: uid

  • path: /usr/local/bin/java

functionname: -classpath C:\ana\samples\bin Logger


注意:

これと同じ構文が前処理アクションのエントリにも適用されます。PPPTYPEがpreaction(事前アクション)であることのみが異なります。

UNIXの場合

UNIXの場合のoblixpppcatalog.lstエントリは次のとおりです。

2e22c064723e4030a05b437e3059fe4d6_1_postaction;exec;uid;/usr/local/bin/java; -LD_LIBRARY_PATH/opt/ana/sample/bin Logger;;

actionName: 2e22c064723e4030a05b437e3059fe4d6_1_postaction

actionType: exec

identityparam1: uid

path: /usr/local/bin/java

functionname: -LD_LIBRARY_PATH/opt/ana/sample/bin Logger

3.4.4.2 インタラクション・メソッド

Get

操作 ユーザーIDのキーの名前 データの説明
GET WfHandler IdentityXML内でasynchResumeWorkflowProcess関数によって予期されるコールバックURL。このURLは次の形式になります。

http://www.domain.com/identity/oblix/ apps/asynch/bin/asynch.cgi

GET WfSubflow 現在のワークフローに属する1つ以上のサブフローのリスト。
GET WfInstance.

<attribute name>

現在のワークフローに属する名前付き属性の1つ以上の値のリスト。

たとえば、WfInstance.obtargetdnは、obtargetdn属性に格納されたターゲットDNの値を参照します。WfInstance属性の完全なリストは、次の表を参照してください。

GET WfStepInstance. <attribute name> 現在のワークフローの現在のステップに属する名前付き属性の1つ以上の値のリスト。

たとえば、WfStepInstance.obactordnは、obactordn属性に格納された、現在のステップを処理している個人のuidの値を参照します。

GET WfAttribute.

<attribute name>

名前付きワークフロー属性の1つ以上の値のリスト。ステップの構成済ワークフロー属性を参照します。
GET WfSubflow.

<subflowid>.

<attribute name>

現在のワークフローの名前付きサブフローIDに含まれる名前付き属性の1つ以上の値のリスト。ただし、属性の名前は、subflowidに関するWfInstance属性のいずれかです。たとえば、WfSubflow.63f004504f83455b924133acd0ef87など。

obtargetdnは、現在のワークフロー・インスタンスからトリガーされるサブフロー(ID: 63f004504f83455b924133acd0ef87)のターゲットDNを参照します。


Set

操作 ユーザーIDのキーの名前 データの説明
SET WfAttribute.

<attribute name>

ステップの任意の構成済ワークフロー属性。
SET WfInstance.Obwf

supplementalval

すべてのサブフローに対して承認ステータスを設定します。複数のワークフローを含むステップにのみ適用されます。設定可能な値は次のとおりです。

rejected

approved


Receive

XMLは、前処理イベントと後処理イベントの場合と同様の方法で受信できますが、形式はEventXMLのみです。

Send

XMLは、前処理イベントと後処理イベントの場合と同様の方法で送信できますが、形式はEventXMLのみです。

SetResultString

このメソッドから戻される文字列は、アイデンティティ・システム・アプリケーションによって表示されます。

3.4.4.3 ワークフロー属性の表

次の表は、WfInstance属性をまとめたものです。

属性名 意味
obactionindicator 内部で使用。
obactorcomment ワークフロー処理中に入力されたコメント。
obapp ワークフローが属するアプリケーション(たとえば、ユーザー・マネージャを意味するuserservcenter)。
obattr 内部で使用。
obcertid 証明書ID(証明書ワークフローで使用)。
obclass ターゲット・エントリのオブジェクト・クラス。
obcurrentdn ワークフローを開始したユーザーのdn。
obcurrentstep 処理中の現在のステップのdn。
obdatecreated ワークフロー・インスタンスが作成された、整数の日付。
obdateprocessed ワークフロー・インスタンスが最後に処理された、整数の日付。
obhostname ワークフローが開始されたマシンのホスト名。
obkey 内部で使用。
oblockedby ワークフロー・チケットをロックしたユーザーのdn。
obparentstep サブフローに適用可能。サブフローをトリガーした親ワークフロー・ステップ・インスタンスのdn。
obparentworkflow サブフローに適用可能。親ワークフロー・インスタンスのdn。
obport ワークフローが開始されたマシンのポート番号。
obtargetdn ターゲット・ユーザー・エントリのdn。
obtriggeredworkflow 内部で使用。トリガー済だが未終了のサブフローの番号を管理します。
obver アイデンティティ・システムのバージョン。
obwfinstanceid インスタンス識別子。
obwfstatus ワークフローのステータス。
obwfsupplementalval トリガーされたすべてのサブフローに関しての、単一の承認ステータスを示します。有効な値は次のとおりです。
  • approved

  • rejected

例:

data->Get("WfInstance.obwfsupplementalval");

obwftypename ワークフローのタイプの表示名。
obworkflowdn ワークフロー定義のdn。
obworkflowname ワークフロー定義の名前。
obworkflowtype ユーザーの作成、属性の変更など、ワークフローのタイプ。

次の表は、WfStepInstance属性をまとめたものです。

属性名 意味
obactionname ステップ・アクション(たとえば、initiate、requestなど)。
obactionreturncode 内部で使用。
obactorcomment ステップ処理のステータス・メッセージ。
obactordn 現在のステップを処理しているユーザーのdn。
obapp ワークフローが属するアプリケーション(たとえば、ユーザー・マネージャを意味するuserservcenter)。
obdatecreated ワークフロー・ステップ・インスタンスが作成された、整数の日付。
obdateprocessed ワークフロー・ステップ・インスタンスが最後に処理された、整数の日付。
obentrycondition 未使用。
obexitcondition 未使用。
oblockedby ワークフロー・チケットをロックしたユーザーのdn。
oboptionalattribute ステップに対して構成されているオプション属性のリスト。属性リストはカンマで区切られています。
obparticipant 未使用。
obprovisionedattribute ステップでサブフローが構成されている属性のリスト。属性リストはカンマで区切られています。
obrequiredattribute ステップに対して構成されている必須属性のリスト。属性リストはカンマで区切られています。
obretrycount ステップが再試行された回数。再試行ステータスがワークフロー・イベント・ハンドラから戻される場合にのみ、適用可能です。
obretrydone 再試行が実行されたかどうかを示すブール値。
obtriggeredworkflow 未使用。
obver アイデンティティ・システムのバージョン。
obwfstatus ステップ・インスタンス処理のステータス。
obwfstepinstid ステップ・インスタンス識別子。
obworkflowstepdn ワークフロー・ステップ定義のdn。
obattr 属性名。
obattrtype 属性タイプ。
obattrvals 属性値。
obver アイデンティティ・システムのバージョン。
obwfattrdefval 未使用。
obwfattrflags 未使用。

3.4.4.4 戻り値

アクションは、Workflow Engineに次の4つのレスポンス値のうち、いずれかを戻す必要があります。

  • STATUS_PPP_OK: アクションが完了したことをWorkflow Engineに通知する値。これにより、Workflow Engineは次のステップに進むことができます。

  • STATUS_PPP_ABORT: エラーが発生したことをWorkflow Engineに通知する値。Workflow Engineは、ワークフローの現在のステップの参加者に、失敗したことを通知し、内部ロジックを使用してエラーを処理します。

  • STATUS_PPP_WF_ASYNC: Workflow Engineに、外部アクションの終了まで待機する保留中ステータスに切り替えるよう通知する値。このステータスからリカバリするには、asynchResumeWorkflowProcessコマンドを送信します。このコマンドの送信先URLをリクエストするには、パラメータ名wfhandlerを使用します。このコマンドとその使用手順は、第2章「IdentityXMLの関数およびパラメータ」を参照してください。

  • STATUS_PPP_WF_RETRY: ステップが完了しなかったことをWorkflow Engineに通知する値。多くの場合、無効データが入力されたことが原因です。ユーザーは正しいデータを入力して、ステップを再試行する必要があります。現在の再試行数は、ワークフロー・ステップ・インスタンスのディレクトリ・エントリで管理されています。属性名obretrycountを使用して、現在の再試行数をリクエストできます。

レスポンス値を正常に戻せないと、サーバーのオペレーティング・システムがかわりにデフォルトの戻り値を戻すため、アプリケーションの動作が予測できなくなります。

3.4.5 パスワード管理イベント

パスワード・ポリシー作成の一端として、「外部的に指定された検証ルール」を有効化するフラグを設定することもできます。このフラグを設定すると、アイデンティティ・システムにより、標準のパスワード管理のかわりに使用できるアクションがないか、カタログがチェックされます。

ロスト・パスワード管理機能に関連するイベントはsetChangedPassword、アプリケーション名はlost_pwd_mgmtです。サンプル・アプリケーション名、イベント名およびアクションを結合すると、lost_pwd_mgmt_setChangedPassword_preになります。これはUserServCenterアプリケーションの標準のネーミング規則ではないことに注意してください。

内容は次のとおりです。

3.4.5.1 カタログ・エントリ

「パスワード管理」では、パスワード検証のイベントのみが使用可能です。そのため、アクション名には固定値PWMGMT_PasswordValidationが設定されます。また、前処理や後処理はサポートされないため、他のアクションでそれらの処理を示すために使用されるpreやpostはこの名前には含まれません。

フィールド名 説明
actionName(パスワード管理のアクション名) 必須。ここには値をPWMGMT_PasswordValidationの形式で入力します。
(他のフィールド) 「構成ファイル(カタログ)」の説明を参照してください。

次に、カタログのパスワード検証イベント・エントリの例を示します。

PWMGMT_PasswordValidation;exec;;..\..\..\unsupported\ppp\ppp_exec\ppp_exec.exe;;

この例では、パスワード検証を行うために、EXEC関数としてppp_exec.exeがコールされます。これによってスタンドアロン・プログラムppp_exec.exeが登録され、ユーザーがパスワードを変更しようとするとパスワード検証が行われます。アクションが実行されるには、次のことがtrueである必要があります。

  • アクションがカタログに構成され、アイデンティティ・システムにデプロイされる必要がある。

  • マスターID管理者は、パスワード・ポリシーを構成して外部検証フラグを有効化する必要がある。

  • パスワード・ポリシーを有効化する必要がある。

パスワード・ポリシーのドメインには、ユーザーIDが含まれている必要があります。

3.4.5.2 インタラクション・メソッド

Get

操作 ユーザーIDのキーの名前 データの説明
GET Password 検証対象とする、ユーザーによって入力されたパスワード値。値は2つのメンバーからなる配列で、NULLで終了しています。
GET PasswordPolicy

Domain

ユーザーに適用されるOracle Access Managerパスワード・ポリシーが定義されたドメイン。
GET PasswordPolicy

Filter

ユーザーに適用されるOracle Access Managerパスワード・ポリシーが定義されたフィルタ。

Set

このメソッドは、パスワード管理イベントではサポートされていません。

Receive

XMLは、前処理イベントと後処理イベントの場合と同様の方法で受信できますが、形式はEventXMLのみです。

Send

XMLは、前処理イベントと後処理イベントの場合と同様の方法で送信できますが、形式はEventXMLのみです。

SetResultString

このメソッドから戻される文字列は、アイデンティティ・システム・アプリケーションによって表示されます。

3.4.5.3 戻り値

アクションでは、次のどちらかの値を戻す必要があります。

  • STATUS_PPP_OK: パスワードが規則に準拠しており、指定された値に変更可能なことを示します。

  • STATUS_PPP_ABORT: パスワードが規則に準拠していないことを示します。変更はできません。

レスポンス値を正常に戻せないと、サーバーのオペレーティング・システムがかわりにデフォルトの戻り値を戻すため、アプリケーションの動作が予測できなくなります。

3.4.6 暗号化イベント

暗号化イベントが発生すると、アイデンティティ・システムによって暗号化アクションがないかカタログがチェックされます。暗号化アクションが存在する場合、アイデンティティ・システムのデフォルト・メソッドではなく、暗号化アクション内に定義されたプロセスが使用されます。

この変更を採用した場合、アイデンティティ・システムにより、暗号化はすべてユーザーのアクション側で行われるように設定されます。使用する暗号化メソッドと復号化メソッドが互いに逆の操作になるように注意してください。

内容は次のとおりです。

3.4.6.1 カタログ・エントリ

暗号化のためのカタログ・エントリには、前処理イベントや後処理イベントのエントリと同じ形式が使用されますが、actionNameのみ異なります。暗号化では、2つのイベントのみが使用可能です。また、前処理や後処理はサポートされないため、他のアクションでそれらの処理を示すために使用されるpreやpostはこの名前には含まれません。

表形式にして説明します。

フィールド名 説明
actionName(暗号化イベントのアクション名) 必須。ここには値をAPPNAME_EVENTNAMEの形式で入力します。この値はアンダースコアで区切られた2つの部分のみで構成されます。

APPNAMEはアイデンティティ・システムのアプリケーション名です。この場合は暗号化のため、ENCRYPTIONと入力します。

暗号化で有効なイベントは2つのみで、具体的には暗号化する情報のタイプです。すなわち、Cookie暗号化キーとチャレンジ・レスポンス暗号化キーです。つまり、EVENTNAMEの許容値は、cookieEncryptionKeyまたはCPResponseEncryptionKeyになります。

(他のフィールド) 「構成ファイル(カタログ)」の説明を参照してください。

次に、カタログの暗号化イベント・エントリの例を示します。

 ENCRYPTION_CPResponseEncryptionKey;lib;;
../../../unsupported/ppp/ppp_dll/ppp_dll.dll;
ProcessCPResponseEncryption;;

この例では、ppp_dll.dllのProcessCPResponseEncryption関数がコールされ、チャレンジ・レスポンス・キーが暗号化されます。

3.4.6.2 インタラクション・メソッド

Get

操作 ユーザーIDのキーの名前 データの説明
GET OPERATION この操作により、次のどちらかの値が戻されます。

ENCRYPT: データが暗号化されます。

DECRYPT: データが復号化されます。

GET INPUTSTR 2つのメンバーからなる、NULLで終了する配列に、ユーザーによって入力された情報を戻します。

Set

操作 ユーザーIDのキーの名前 データの説明
SET OUTPUTSTR アイデンティティ・システムに戻す情報。NULL終端文字を指定する必要があります。

Receive

XMLは、前処理イベントと後処理イベントの場合と同様の方法で受信できますが、形式はEventXMLのみです。

Send

XMLは、前処理イベントと後処理イベントの場合と同様の方法で送信できますが、形式はEventXMLのみです。

SetResultString

このメソッドから戻される文字列は、アイデンティティ・システム・アプリケーションによって表示されます。

3.4.6.3 レスポンス値

イベントでは、次のどちらかの値を戻す必要があります。

  • STATUS_PPP_OK: 暗号化が正常に終了したことを示すために送信する値

  • STATUS_PPP_ABORT: 暗号化が正常に終了しなかったことを示すために送信する値

  • 暗号化はアイデンティティ・システムの操作に不可欠であるため、STATUS_PPP_OK以外のレスポンスが戻されると、アイデンティティ・システム・インスタンスは停止し、バグ・レポートが生成されます。

3.5 API

この項では、APIの使用方法に関する開発者向けの追加情報を説明します。内容は次のとおりです。


注意:

アイデンティティ・イベントAPIプロジェクトのファイルの名前の中には空白を使用しないでください。

3.5.1 LIBアクションの詳細

LIBアクションは、動的共有オブジェクト(DSO)ライブラリに格納して、(C言語コール規則で)コール可能な機能として実装します。DSOはアイデンティティ・システムが稼働中のプラットフォームにネイティブなものです。たとえば、NTでは.dll、Solaris UNIXでは.soになります。


注意:

LIBプラグインの開発時には、グローバルデータをスレッド・セーフな方法で実装する必要があります。

LIBアクションは、アイデンティティ・システム・サーバー・プロセスのアドレス空間で実行されます。アイデンティティ・システムでは見つからないプログラミング・エラーのクラス(ゼロ除算エラーなど)があり、サーバーに障害やその他の不安定な動作を発生させる可能性があるため、LIBアクションはデプロイ前に徹底的にテストすることが重要です。

LIBアクションは、「イベントのアクションへの接続」の説明のとおり、必要なパラメータを渡してAPI関数を直接コールすることによって、アイデンティティ・システム・アプリケーションと通信します。

3.5.2 MANAGEDLIBアクションの詳細

MANAGEDLIBアクションはクラス上のメソッドです。MANAGEDLIBアクションをメソッドとして、プラグインで定義済のEventAPIクラスに実装します。DSOはアセンブリまたはdllです。


注意:

MANAGEDLIBプラグインの開発時には、EventAPIクラスのメンバー変数にスレッド・セーフな方法でアクセスする必要があります。

MANAGEDLIBアクションは、アイデンティティ・サーバー・プロセスのアドレス空間で実行されます。このアクションは、デプロイ前に徹底的にテストすることが重要です。ただし、管理プラグインによって生成された例外はすべて、アイデンティティ・サーバーによって捕捉され、ロギングされて、バグ・レポート・ページが生成されます。

MANAGEDLIBアクションは、「イベントのアクションへの接続」の説明のとおり、必要なパラメータを渡してAPI関数を直接コールすることによって、アイデンティティ・システム・アプリケーションと通信します。

VB.NETでEventAPI PPPプラグインをコンパイルする際には、次のことを確認してください。

  • VBクラスの名前がEventAPIであること。

  • コード内で名前空間を使用していないこと。

  • VBプロジェクトが開かれたVisual Studio.NETのプロジェクトのプロパティ設定で、「ルート名前空間」を空白のままにしていること。

    プロジェクトに移動し、「プロパティ」、そして「共通プロパティ」の「全般」ページに順に移動し、「ルート名前空間」の値を削除して「OK」をクリックします。

上のリストにあげた項目の1つでも順守できていないと、アイデンティティ・サーバーではユーザーのdllがロードされません。


注意:

PPPイベントに使用されるすべての管理ライブラリでは、グローバル名前空間レベルでEventAPIクラスが宣言されている必要があります。つまり、名前空間なしで宣言する必要があります。C#ライブラリの場合、ソース・コードから名前空間ディレクティブを削除するのみです。VB.Netライブラリの場合、プロジェクトからデフォルトの名前空間のオプションを削除します。

3.5.3 EXECアクションの詳細

EXECアクションはスタンドアロンの実行可能プログラムとして実装します。アクションは、カタログで指定されたコマンドライン・パラメータと、アクションを実行させるイベントのIDプログラムからのXMLデータの、2種類の入力を受け取ります。パラメータは、main()関数に渡されたARGV[]配列で受け取られます(C/C++プログラミング環境の場合)。XMLデータは、実行可能ファイルの標準入力ストリームであるSTDINからストリームとして入力できます。

XMLデータの内容は、イベントが前処理イベントおよび後処理イベントのいずれであるかによって異なります。前処理イベントの場合、データはリクエストの記述で、EventXML形式で提供されます。後処理イベントの場合、データはリクエストの処理結果を表し、PresentationXML形式で提供されます。(PresentationXMLは、通常XSLスタイルシートと組み合されるXMLで、最終的にHTMLに変換されユーザーのブラウザで表示されます。)アクションはタスクを実行し、オプションで、変更されたXMLを受信した形式と同じ形式で、実行可能ファイルの標準出力STDOUTに書き込みます。情報がSTDOUTに戻される場合、アイデンティティ・システムはその情報を捕捉し、その新規データに基づいてHTMLを生成します。


注意:

アイデンティティ・システムがXMLデータとXSLスタイルシートを論理的に組み合せ、HTML表示を作成するプロセスに関しては、このマニュアルの対象範囲外です。『Oracle Access Managerカスタマイズ・ガイド』のPresentationXMLに関する章を参照してください。

開発者は、STDINおよびSTDOUTを使用することによって、これらのデータ・ストリームをサポートする任意の言語でEXECアクションをコーディングできるようになります。このような言語には、C、C++、PERL、Python、UNIXシェルおよび.NET(C#、MC++、VisualBasicなど)があります。タスクを実行するためにデータへのアクセスが必要な場合、EXECアクションは任意のXMLパーサーを起動して、XMLを解析します。アイデンティティ・システムでは、組込みパーサーは提供されていません。EXECアクションはXMLの妥当性を保証する必要があります。保証されない場合、後続の処理で、ユーザーに表示される前に適用されるOracle付属またはカスタムのXSLスタイルシートによって、期待する結果が戻されない可能性があります。この制約内で、EXECアクションは次のような必要となる処理を実行できます。

  • アイデンティティ・システムのデータを解析し、その結果に基づいてアクションを実行できます。

  • 出力ストリームでアイデンティティ・システムのデータの一部またはすべてを異なるデータと置換し、アイデンティティ・システム・データのXMLスキーマとの整合性を保証することによって、データをフィルタリングできます。

  • アイデンティティ・システム・データをそのまま渡すこともできますが、ネットワークの別の場所で別のビジネス・プロセスを起動することもできます。たとえば、ユーザー・マネージャでworkflowActivateSaveイベントを処理するアクションは、アクティブ化されたユーザーの数を管理できます。ユーザー数が特定のしきい値に到達すると、アクションは、データ損失のリスクを最小限に抑えるために、バックアップまたはレプリケーションのプロシージャをトリガーします。あるいは、突然多くのユーザーがアクティブ化された理由を調査するITマネージャに、電子メールを送信します。

3.5.4 EXECコールからエラー・メッセージを戻す

1つのEXECコールから複数のエラー・メッセージを戻すために使用できるインタフェースが3つあります。3つの共通インタフェースは次のとおりです。

  • EXEC - WF

  • EXEC - PRE

  • EXEC - POST

3.5.4.1 EXEC - WFを使用してエラー・メッセージを戻す

エラー・メッセージをアイデンティティ・システムに戻すには、表示するメッセージとともにObResultStringをXMLに指定します。メッセージは、ユーザーがチケットを処理した後に、確認ページに表示されます。

XMLは次のように作成する必要があります。

<ObEventParams>
<ObParam name="ObResultString">
<ObValue>The value of the result string goes here...</ObValue>
</ObParam>
<ObParamList name="WfAttribute">
<ObParam name="cn">
<ObValue>New value(s) go here...</ObValue>
</ObParam>
<ObParam name="sn">
<ObValue>New value(s) go here...</ObValue>
<ObValue>New value(s) go here...</ObValue>
</ObParam>
</ObParamList>
<ObParamList name="WfInstance">
<!--
NOTE: This is the only parameter that can be changed. 
The parameter is used to set the outcome of a sub-flow. 
It will be displayed as the 'Outcome' value in the 'Subflow Approval' step. 
By default, the Identity System sets this parameter to 'approved' or 'rejected' in an 'Approval' step.
-->
<ObParam name="obwfsupplementalval">
<ObValue> New value(s) go here...</ObValue>
</ObParam>
</ObParamList>
</ObEventParams>

3.5.4.2 EXEC - PREを使用してエラー・メッセージを戻す

PREイベントの場合、XMLはWFイベントとほぼ同じ方法で作成します。DOMは同じです。相違点は、パラメータ名にあります。パラメータは常にObRequestで始まり、その後に変更するパラメータが続きます。PREイベントの結果文字列を設定するには、実行可能ファイルがSTATUS_PPP_ABORTを戻す必要があります。

<ObEventParams>
<ObParam name="ObRequest.uid">
<ObValue>cn=Thomas Remahl,o=Company,c=US</ObValue>
</ObParam>
<ObParam name="ObResultString">
<ObValue>Always viewing: cn=Thomas Remahl,o=Company,c=US</ObValue>
</ObParam>
</ObEventParams

3.5.4.3 EXEC - POSTを使用してエラー・メッセージを戻す

POSTイベントの場合、XMLはプラグインに関連付けられたイベントに準拠する必要があります。POSTイベントの結果文字列を設定するには、通常、アイデンティティ・システムに戻されたXMLに<ObTextMessage>要素を埋め込みます。戻された文字列が表示されるかどうかは、関連するスタイルシートによって異なります。

たとえば、次の例の表示イベントの出力では、戻された文字列「Hello, World!」が表示されます。すでに言及しているように、要素が適用されるかどうかはスタイルシートによって決定されます。次の例では、この要素はusc_profile.xslです。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="../../../lang/en-us/style0/usc_profile.xsl" type="text/xsl"?>
<Oblix xmlns:oblix="http://www.oblix.com/" xmlns="http://www.oblix.com/" oblang="en-us">
<ObProfile>
<ObTextMessage>
Hello, World!
</ObTextMessage>
<ObPanel obname="defaultPanel" obpanelId="20040401T22135679142" obpanelClass="gensiteorgperson">
<ObAttribute obattrName="genUserID">
<ObDisplay obdisplayName="UID" obdisplayType="textS" obsemanticType="ObSLogin" 
obname="genUserID" obmode="view" obcanRequest="false" obrequired="false">
<ObTextS>
<ObValue>Admin</ObValue>
</ObTextS>
</ObDisplay>
</ObAttribute>
<ObAttribute obattrName="sn">
<ObDisplay obdisplayName="Last Name:" obdisplayType="textS" obname="sn" obmode="view" 
obcanRequest="false" obrequired="false">
<ObTextS>
<ObValue>dmÔn</ObValue>
</ObTextS>
</ObDisplay>
</ObAttribute>
<ObAttribute obattrName="cn">
<ObDisplay obdisplayName="Name" obdisplayType="textS" obname="cn" obmode="view" 
obcanRequest="false" obrequired="false">
<ObTextS>
<ObValue>Master dmÔn</ObValue>
</ObTextS>
</ObDisplay>
</ObAttribute>
</ObPanel>
<ObPanel obname="miisPanel" obpanelId="20040406T10492776123" obpanelClass="gensiteorgperson">
<ObAttribute obattrName="cn.person.miis">
<ObDisplay obdisplayName="MIIS Name" obdisplayType="textS" obname="cn.person.miis" 
obmode="view" obcanRequest="false" obrequired="false">
<ObTextS></ObTextS>
</ObDisplay>
</ObAttribute>
<ObAttribute obattrName="userSMIMECertificate.person.miis">
<ObDisplay obdisplayName="MIIS Password" obdisplayType="password" obsemanticType="ObSPassword" 
obname="userSMIMECertificate.person.miis" obmode="view" obcanRequest="false" obrequired="false">
<ObPassword oboldpsw="false"></ObPassword>
</ObDisplay>
</ObAttribute>
</ObPanel>
<ObHeaderPanel>
<ObAttribute obattrName="cn">
<ObDisplay obdisplayName="Name" obdisplayType="textS" obname="cn" obmode="view" 
obcanRequest="false" obrequired="false">
<ObTextS>
<ObValue>Master dmÔn</ObValue>
</ObTextS>
</ObDisplay>
</ObAttribute>
</ObHeaderPanel>
<ObRequestInfo>210498888</ObRequestInfo>
<ObScripts>
<ObScript obname="../../../lang/en-us/msgctlg.js"></ObScript>
<ObScript obname="../../../lang/shared/i18n.js"></ObScript>
<ObScript obname="../../../lang/shared/nsiesetup.js"></ObScript>
<ObScript obname="../../../lang/shared/misc.js"></ObScript>
<ObScript obname="../../../lang/shared/miscsc.js"></ObScript>
<ObScript obname="../../../lang/shared/horizontalprofile.js"></ObScript>
<ObScript obname="../../../lang/shared/userservcenter.js"></ObScript>
</ObScripts>
<ObForm obname="profileForm" obmethod="post" obaction="userservcenter.cgi?
tab_id=Employees&amp;uid=cn%3DMaster%20%C5dm%EFn%2Co%3DCompany%2Cc%3DUS">
<ObInput obtype="hidden" obname="program" obvalue="view"></ObInput>
<ObInput obtype="hidden" obname="visiblePanel"></ObInput>
</ObForm>
<ObDisplay obdisplayName="ObTextMessage" obdisplayType="textS" obname="ObTextMessage" 
obmode="view" obcanRequest="false" obrequired="false">
<ObTextS>
<ObTextMessage></ObTextMessage>
</ObTextS>
</ObDisplay>
<ObTextMessage></ObTextMessage>
<ObSelectorInfoForm>
<ObForm obname=""></ObForm>
</ObSelectorInfoForm>
<ObButton obaction="initiateDeactivateUser"></ObButton>
<ObButton obaction="userreactivate"></ObButton>
<ObButton obaction="wfTicketDelete"></ObButton>
<ObButton obaction="userModify" obimageUrl="NAVmodify" obmouseOver="Modify this profile." 
obhref="../../userservcenter/bin/userservcenter.cgi?program=modify&amp;
tab_id=Employees&amp;uid=cn%3DMaster%20%C5dm%EFn%2Co%3DCompany%2Cc%3DUS"></ObButton>
<ObStatus>0</ObStatus>
</ObProfile>
<ObNavbar obbgcolor="#669966">
<ObMisc>
<ObButton obaction="T1help" obimageUrl="T1help" obmouseOver="View Online Help" 
obhref="javascript:ObHelp('../../help/bin/help.cgi?program=helpProgram&amp;
helpAppContext=userservcenter&amp;helpEventContext=view&amp;helpTOCContext=application');
"></ObButton>
<ObButton obaction="T1about" obimageUrl="T1about" obmouseOver="Product Information and Feedback" 
obhref="userservcenter.cgi?program=aboutOblix&amp;tab_id=Employees"></ObButton>
<ObButton obaction="T1logout" obimageUrl="T1logout" obmouseOver="Logout" 
obhref="userservcenter.cgi?program=commonLogout&amp;sessionUid=20040407T14380285745">
</ObButton>
</ObMisc>
<ObApps>
<ObApplication>
<ObButton obaction="userservcenter_application_info" obimageUrl="T1TABusermanager" 
obmouseOver="User Manager" obhref="../../userservcenter/bin/userservcenter.cgi" 
obanchorText="User Manager"></ObButton>
<ObTitle>
<ObButton obaction="T1TABusermanager"></ObButton>
</ObTitle>
<ObFunctions>
<ObButton obaction="MyProfile" obimageUrl="FTABmyidentity2" obmouseOver="View my profile." 
obhref="userservcenter.cgi?program=view&amp;uid=cn%3DMaster%20%C5dm%EFn%2Co%3DCompany%2Cc%3DUS&amp;
tab_id=Employees"></ObButton>
<ObButton obaction="Report" obimageUrl="FTABreports" obmouseOver="Report Functions" 
obhref="userservcenter.cgi?program=mainReports&amp;appName=userservcenter&amp;
tab_id=Employees"></ObButton>
<ObReportFunctions>
<ObButton obaction="generateReport" obimageUrl="2FTABgeneratereport" 
obmouseOver="Generate a report" 
obhref="javascript:QueryBuilder('../../querybuilder/bin/querybuilder.cgi?program=modifyFilter&
amp;tab_id=Employees&amp;appName=userservcenter&
amp;uid=cn%'+'3DMaster%'+'20%'+'C5dm%'+'EFn%'+'2Co%'+'3DCompany%'+'2Cc%'+'3DUS&amp;
advModeDisable=true&amp;slapTab=true','','..%'+'2F..%'+'2Fuserservcenter%'+'2Fbin%'+
'2Fuserservcenter.cgi%'+'3Fprogram%'+'3DshowReportsResults%'+'26appName%'+'3Duserservcenter%'+
'26tab_id%'+'3DEmployees%'+'26fromQB%'+'3Dtrue','')"></ObButton>
<ObButton obaction="viewPredefinedReports" obimageUrl="2FTABviewpredefinedreports" 
obmouseOver="View predefined reports" obhref="userservcenter.cgi?program=predefinedReports&amp;
appName=userservcenter&amp;tab_id=Employees"></ObButton>
</ObReportFunctions>
<ObButton obaction="wfCreateProfile" obimageUrl="FTABcreateuseridentity" 
obmouseOver="Create New User" obhref="userservcenter.cgi?program=workflowCreateProfile&amp;
tab_id=Employees"></ObButton>
<ObButton obaction="wfDeactivateProfile" obimageUrl="FTABdeactivateuseridentity" 
obmouseOver="Search on Deactivated Persons." obhref="userservcenter.cgi?
program=workflowDeactivatedUserSearchResults&amp;tab_id=Employees"></ObButton>
<ObButton obaction="adminProxy" obimageUrl="FTABsubstituterights" 
obmouseOver="Configure Proxy Administration" obhref="userservcenter.cgi?
program=proxyAdmin&amp;tab_id=Employees"></ObButton>
<ObButton obaction="Workflow" obimageUrl="FTABrequests" obmouseOver="Workflow Functions" 
obhref="userservcenter.cgi?program=workflowMain&amp;tab_id=Employees"></ObButton>
<ObWorkflowFunctions>
<ObButton obaction="wfIncomingRequest" obimageUrl="2FTABincomingrequests" 
obmouseOver="Incoming Request" obhref="../../userservcenter/bin/userservcenter.cgi?
program=workflowTicketSearchForm&amp;tab_id=Employees&amp;
requestType=incomingRequests"></ObButton>
<ObButton obaction="wfOutgoingRequest" obimageUrl="2FTABoutgoingrequests" 
obmouseOver="Outgoing Request" obhref="../../userservcenter/bin/userservcenter.cgi?
program=workflowTicketSearchForm&amp;tab_id=Employees&amp;
requestType=outgoingRequests"></ObButton>
<ObButton obaction="wfMonitor" obimageUrl="2FTABmonitorrequests" 
obmouseOver="Requests Monitor" obhref="../../userservcenter/bin/userservcenter.cgi?
program=workflowMonitorSearchForm&amp;tab_id=Employees"></ObButton>
</ObWorkflowFunctions>
<ObButton obaction="Admin" obimageUrl="FTABconfiguration" 
obmouseOver="Administrative Functions" obhref="userservcenter.cgi?
program=administrationMain&amp;tab_id=Employees"></ObButton>
<ObAdminFunctions>
<ObButton obaction="adminAccessControl" obimageUrl="2FTABattraccesscontrol" 
obmouseOver="Configure Attribute Access Control" 
obhref="javascript:DetectPluginForApplets('../../userservcenter/bin/userservcenter.cgi?
program=mainAccessAdmin&amp;tab_id=Employees')"></ObButton>
<ObButton obaction="adminDelegate" obimageUrl="2FTABdelegateadmin" 
obmouseOver="Configure Delegated Administration" 
obhref="javascript:DetectPluginForApplets('../../userservcenter/bin/userservcenter.cgi?
program=mainDelegateAdmin&amp;tab_id=Employees')"></ObButton>
<ObButton obaction="adminWorkflowDef" obimageUrl="2FTABworkflowdefinition" 
obmouseOver="Configure Workflow Definition" 
obhref="javascript:DetectPluginForApplets('../../userservcenter/bin/userservcenter.cgi?
program=mainWorkflowAdmin&amp;tab_id=Employees')"></ObButton>
<ObButton obaction="adminSetSearchbase" obimageUrl="2FTABsetsearchbase" 
obmouseOver="Configure Localized Access" 
obhref="javascript:DetectPluginForApplets('../../userservcenter/bin/userservcenter.cgi?
program=mainSetSearchbase&amp;tab_id=Employees')"></ObButton>
</ObAdminFunctions>
</ObFunctions>
</ObApplication>
<ObApplication>
<ObButton obaction="groupservcenter_application_info" obimageUrl="T1TABgroupmanager" 
obmouseOver="Group Manager" obhref="../../groupservcenter/bin/groupservcenter.cgi" 
obanchorText="Group Manager"></ObButton>
<ObTitle></ObTitle>
<ObFunctions></ObFunctions>
</ObApplication>
<ObApplication>
<ObButton obaction="objservcenter_application_info" obimageUrl="T1TABorgmanager" 
obmouseOver="Org. Manager" obhref="../../objservcenter/bin/objservcenter.cgi" 
obanchorText="Org. Manager"></ObButton>
<ObTitle></ObTitle>
<ObTabs></ObTabs>
<ObFunctions></ObFunctions>
</ObApplication>
<ObApplication>
<ObButton obaction="corpdir_application_info"></ObButton>
<ObTitle></ObTitle>
<ObTabs></ObTabs>
<ObFunctions></ObFunctions>
</ObApplication>
<ObApplication>
<ObButton obaction="dashline" obmouseOver="------------------------------------" 
obhref="userservcenter.cgi?"></ObButton>
</ObApplication>
<ObApplication>
<ObButton obaction="front_page_admin_application_info" obimageUrl="T1TABidentityadmin" 
obmouseOver="Identity System Console" obhref="../../admin/bin/front_page_admin.cgi" 
obanchorText="Identity System Console"></ObButton>
</ObApplication>
</ObApps>
<ObScripts>
<ObScript obname="../../../lang/en-us/msgctlg.js"></ObScript>
<ObScript obname="../../../lang/shared/i18n.js"></ObScript>
<ObScript obname="../../../lang/shared/misc.js"></ObScript>
<ObScript obname="../../../lang/shared/helpcommon.js"></ObScript>
<ObScript obname="../../../lang/shared/wf_qs.js"></ObScript>
</ObScripts>
<ObStatus>0</ObStatus>
<ObUserName>Master dmÔn</ObUserName>
</ObNavbar>
<ObSearchForm>
<ObSearchRow>
<ObDisplay obdisplayName="" obdisplayType="select" obname="STy1" obmode="modify" 
obrequired="true" obcardinality="singleValued" obcanRequest="false">
<ObSelect obmultiple="false">
<ObChoice obdisplayName="Last Name:" obselected="false">sn</ObChoice>
<ObChoice obdisplayName="MIIS Name" obselected="false">cn.person.miis</ObChoice>
<ObChoice obdisplayName="Name" obselected="true">cn</ObChoice>
<ObChoice obdisplayName="UID" obselected="false">genUserID</ObChoice>
</ObSelect>
</ObDisplay>
<ObDisplay obdisplayName="" obdisplayType="select" obname="SLk1" obmode="modify" 
obrequired="false" obcardinality="singleValued" obcanRequest="false">
<ObSelect obmultiple="false">
<ObChoice obdisplayName="That Contains" obselected="false">OOS</ObChoice>
<ObChoice obdisplayName="Contains In Order" obselected="false">OSM</ObChoice>
<ObChoice obdisplayName="=" obselected="false">OEM</ObChoice>
<ObChoice obdisplayName="&lt;=" obselected="false">OLE</ObChoice>
<ObChoice obdisplayName="&gt;=" obselected="false">OGE</ObChoice>
<ObChoice obdisplayName="That Begins With" obselected="false">OBW</ObChoice>
<ObChoice obdisplayName="That Ends With" obselected="false">OEW</ObChoice>
<ObChoice obdisplayName="That Sounds Like" obselected="false">OSL</ObChoice>
<ObChoice obdisplayName="!=" obselected="false">ONE</ObChoice>
</ObSelect>
</ObDisplay>
<ObDisplay obdisplayName="" obdisplayType="textS" obname="SSt1" obmode="modify" 
obrequired="false" obcardinality="singleValued" obcanRequest="false">
<ObDisplayProperties>
<ObDisplayProperty obname="onKeyDown" 
obvalue="javascript:checkSearchKey(event,this)"></ObDisplayProperty>
</ObDisplayProperties>
<ObTextS oblength="19"></ObTextS>
</ObDisplay>
</ObSearchRow>
<ObAdvancedSearch obadvancedSearchOn="false">
<ObDisplay obdisplayName="" obdisplayType="radio" obname="showAllResults" 
obmode="modify" obrequired="true" obcardinality="singleValued" obcanRequest="false">
<ObRadio>
<ObChoice obdisplayName="All" obselected="false">true</ObChoice>
<ObChoice obdisplayName="" obselected="true">false</ObChoice>
</ObRadio>
</ObDisplay>
<ObDisplay obdisplayName="" obdisplayType="textS" obname="noOfRecords" 
obmode="modify" obrequired="true" obcardinality="singleValued" obcanRequest="false">
<ObTextS oblength="2">
<ObValue>8</ObValue>
</ObTextS>
</ObDisplay>
</ObAdvancedSearch>
<ObRequestInfo>210498888</ObRequestInfo>
<ObScripts>
<ObScript obname="../../../lang/en-us/msgctlg.js"></ObScript>
<ObScript obname="../../../lang/shared/i18n.js"></ObScript>
<ObScript obname="../../../lang/shared/misc.js"></ObScript>
</ObScripts>
<ObForm obname="searchForm" obmethod="post" obaction="userservcenter.cgi?">
<ObInput obtype="hidden" obname="program" obvalue="search"></ObInput>
<ObInput obtype="hidden" obname="tab_id" obvalue="Employees"></ObInput>
<ObInput obtype="hidden" obname="startFrom" obvalue="0"></ObInput>
<ObInput obtype="hidden" obname="getPrevRecords" obvalue="false"></ObInput>
<ObInput obtype="hidden" obname="noOfFields" obvalue="1"></ObInput>
<ObInput obtype="hidden" obname="displayFormat" obvalue="2"></ObInput>
<ObInput obtype="hidden" obname="advSearch" obvalue="false"></ObInput>
<ObInput obtype="hidden" obname="searchStringMinimumLength" obvalue="3"></ObInput>
<ObInput obtype="hidden" obname="searchSameAttrAsOr" obvalue="false"></ObInput>
</ObForm>
<ObDisplay obdisplayName="ObTextMessage" obdisplayType="textS" 
obname="ObTextMessage" obmode="modify" obrequired="false" obcardinality="singleValued" 
obcanRequest="false">
<ObTextS>
<ObTextMessage></ObTextMessage>
</ObTextS>
</ObDisplay>
<ObSelectorInfoForm>
<ObForm obname=""></ObForm>
</ObSelectorInfoForm>
<ObButton obaction="searchGo" obimageUrl="SEARCHgo" obmouseOver="Start search." 
obhref="javascript:validateSearchAndSubmit('search')"></ObButton>
<ObButton obaction="searchAdvance" obimageUrl="SEARCHadvanced" 
obmouseOver="Advanced search." obhref="javascript:validateSearchAndSubmit('moreFields')">
</ObButton>
<ObButton obaction="searchLess"></ObButton>
<ObButton obaction="searchMore" obimageUrl="SEARCHmore" obmouseOver="Get more fields." 
obhref="javascript:validateSearchAndSubmit('moreFields')"></ObButton>
<ObButton obaction="searchAll" obimageUrl="SEARCHall" obmouseOver="All fields." 
obhref="javascript:validateSearchAndSubmit('allFields')"></ObButton>
<ObStatus>0</ObStatus>
</ObSearchForm>
<ObStatus>0</ObStatus>
</Oblix>

3.5.5 開発環境

アイデンティティ・イベント・プラグインAPIは、LIBアクションをビルドするために使用できる一連のヘッダー・ファイル、LIB、MANAGEDLIBおよびEXECのアクションで作業するためのソース・コード例、XMLパーサー作成のためのソース・コード例、およびアクション構成エントリの例を数多く持つデフォルトのobpppcatalog.lstファイルから構成されています。Windowsプラットフォームでは、LIBアクションのビルドに必要なインポート・ライブラリも提供されています。これらすべてのファイルは、標準アイデンティティ・システム・インストールにバンドルされています。アクションの開発のためにこの他にインストールするものはありません。

マネージ・コードの場合、プラグイン開発者は、IPPPDataインタフェースが含まれるpppInterface.dllにコンパイルおよびリンクする必要があります。このアセンブリは次にあります。

install_dir/oblix/include/managed/pppinterface.dll

このパスは、Visual StudioではResolve #using Referenceとして参照する必要があります。または、プラグインのコンパイルおよびリンク時に、/AIコンパイラ・オプションを使用して参照する必要があります。アイデンティティ・サーバーとプラグインは、ともに実行時にpppInterface.dllを探す必要があります。このため、pppInterface.dllはアイデンティティ・サーバーのインストール時に、Global Assembly Cache(GAC)にインストールされます。あるいは、プラグイン開発者がアイデンティティ・システムのインストールされていないマシンでプラグインをテストする場合、pppInterface.dllを個別にデプロイすることもできます。これは、プラグインのbinディレクトリにアセンブリを設定することを意味します。実行時に使用するのと同じバージョンのpppInterface.dllにコンパイルおよびリンクすることが重要です(GACと個別デプロイのいずれの場合でも)。そうしないと、Common Language Runtime(CLR)によって例外がスローされる場合があります。

次の表に、カスタム・アクション開発のために知っておく必要のあるファイルが示されています。

3.5.5.1 LIBアクションおよびEXECアクションのライブラリ・ファイル

ディレクトリ:

$Identity_install_Dir/oblix/lib

ファイル名 説明
ppp.lib (Windowsプラットフォーム専用。)アイデンティティ・システムに付属の記号への参照を解決するために、LIBアクションDLLをリンクする必要のあるエクスポート・ライブラリ。

ディレクトリ:

$Identity_install_Dir/oblix/include/ppp

ファイル名 説明
obppp.h API関数によって使用される基本的な成功/失敗ステータスのリターン・コードが定義されています。LIBアクション関数を宣言するために使用する必要のあるObActionFunc関数シグネチャが宣言されています。
obpppdata.h アイデンティティ・システムとLIBアクション間でのデータ転送に使用する必要がある、ObPPPData C++クラスが定義されています。
obpppwf.h アイデンティティ・システムのワークフロー機能と連携するアクションの開発に使用される定数が定義されています。

3.5.5.2 MANAGEDLIBアクション用のライブラリ・ファイル

pppInterface.dllは次にあります。

$Identity_install_dir\identity\oblix\include\managed\

これは、プラグインのコンパイル/リンク先となるdllです。

ファイル名 説明
pppInterface.dll (Windowsプラットフォーム専用。)MANAGEDLIBアクション用のDSO。

3.5.5.3 LIBアクションのファイル例

これらのファイルは単なる例であり、製品には含まれていません。アイデンティティ・システム・ディレクトリ・ツリーの\unsupportedブランチを参照してください。ディレクトリ:

Identity_install_dir/oblix/unsupported/ppp/ppp_dll

ファイル名 説明
libppp_dll.so Solaris UNIXプラットフォーム専用。このディレクトリ例にあるソース・ファイルのビルトイン動的共有オブジェクト(DSO)です。oblixpppcatalog.lstファイルにあるlibアクションのエントリの一部としてこのDSOへのパスを指定します。このパスは、pppdlltest.cppに定義されている、このDLL内のアクション関数のいずれかの名前を指定する際に使用されます。

また、libppp_dll.so DSOへのパスを共有ライブラリ検索パスに含める必要があります。これには、ldコマンドの-Lオプションを使用することをお薦めします。あるいは、LD_LIBRARY_PATH環境変数を使用することをお薦めします。この変数は、DSOの検索時に、検索対象のディレクトリの予備をランタイム共有ライブラリ・ローダー(ld)に渡すように設定できます。

ppp_dll.dll Windowsプラットフォーム専用。このディレクトリ例のソース・ファイルのビルトイン・ダイナミック・リンク・ライブラリ(DLL)です。oblixpppcatalog.lstファイルにあるlibアクションのエントリの一部としてこのDLLへのパスを指定します。このパスは、pppdlltest.cppに定義されている、このDLL内のアクション関数のいずれかの名前を指定する際に使用されます。
ppp_dll.sln Windowsプラットフォーム専用。自分自身でppp_dll.dllをビルドするために使用できる、Microsoft Visual C++プロジェクト・ファイルです。
pppdlltest.cpp Oracleに付属のLIBアクションの例用のC++ソース・ファイル。
ppputil.cpp 含まれる内容:

APIを介してアクションが利用できるアイデンティティ・システム・データへのアクセス方法を示すC++クラス。例では単に、ファイル・システムへデータが書き出されています。

ユーザーがグループ・サブスクリプションをリクエストするための、XML SOAPメッセージの構成方法を示すC関数MakePayload。

ppputil.h ppputil.cppのクラス宣言および関数宣言。
nis_client.cpp WebPassを使用してアイデンティティ・システムにメッセージを送信できる、HTTPクライアントを実装するC++クラスを提供します。これをppputil.cppで説明したMakePayload関数と組み合せることにより、アクションでIdentityXMLインタフェースまたはAccessXMLインタフェースを使用してアイデンティティ・システムのリクエストを作成できます。この例は、アプリケーション間での使用のサポートに特に役立ちます。「アプリケーション間での使用のサポート」を参照してください。
nis_client.h nisclient.cppのクラス宣言および関数宣言です。

ヒント: nis_client.hで提供されているConfigurationStructureクラスを使用する場合、nis_client.h内に特定のConfigurationStructureクラスの宣言があるか、または同じクラスが他の機能で使用されていると、クラスがコールされないことに注意してください。

アイデンティティ・サーバーの起動時、ConfigurationStructureクラスは、PPPプラグイン内に存在するConfigurationStructureクラスよりも先にロードされます。Solarisは常にConfigurationStructureクラスのコンストラクタをコールしますが、PPPプラグインのnis_client.cppファイル内にあるConfigurationStructureクラスのコンストラクタはコールしません。なお、Solarisがコンパイル時にのみ記号をバインドするよう、-Wl,-B,symbolicオプションを使用してlibppp_dll.soをビルドすることをお薦めします。

makefile Solaris、UNIXプラットフォーム専用。libppp_dll.sを作成するために使用されるUNIXのmakeファイルです。

3.5.5.4 MANAGEDLIBアクションのファイル例

ディレクトリ:

Identity_install_dir\unsupported\ppp\dotnet\managedcplusplus\Release

ファイル名 説明
managedcplusplus.cpp (Windowsプラットフォーム専用。)Oracleに付属のMANAGEDLIBアクションの例用のMC++ソース・ファイルです。
managedcplusplus.h (Windowsプラットフォーム専用。)managedcplusplus.cppのヘッダー・ファイルです。アイデンティティ・イベントAPIのアクションとして指定されているメソッドが含まれるシングルトン・クラスが定義されています。
managedcplusplus.sln (Windowsプラットフォーム専用。)自分でmanagedcplusplus.dllをビルドするために使用できる、Microsoft Visual C++のマネージ・コード・プロジェクト・ファイルです。
managedcplusplus.vcproj (Windowsプラットフォーム専用。)プロジェクトのビルドに必要となる構成が含まれた、Microsoft Visual C++のマネージ・コード・プロジェクト・ファイルです。
managedcplusplus.dll サンプル・プラグインです。
pppfilewriter.cpp (Windowsプラットフォーム専用。)アイデンティティ・システムのデータを受信し、データをファイルに書き込むユーティリティ・クラスです。
pppfilewriter.h (Windowsプラットフォーム専用。)pppfilewriter.cppのヘッダー・ファイルです。

3.5.5.5 EXECアクションのファイル例

ディレクトリ:

Identity_install_dir/oblix/unsupported/ppp/ppp_exec

ファイル名 説明
ppp_exec_test.java Oracleに付属の後処理用EXECアクションの例の、Javaバージョンのソース。このプログラムは、oblixpppcatalog.lstファイルのEXECアクションとして参照できます。
ppp_exec.exe (Windowsプラットフォーム専用。)この例をユーザーが利用できるよう、pppexectest.cppファイルを基に事前にビルドされた、NTの実行可能ファイルです。このプログラムは、oblixpppcatalog.lstファイルのEXECアクションとして参照できます。
ppp_exec.sln (Windowsプラットフォーム専用。)ユーザーが自分でppp_exec.exeをビルドするために使用できる、Microsoft Visual C++プロジェクト・ファイルです。
pppexectest.cpp Oracleに付属のEXECアクションの例用のC++ソース・ファイル。
ppp_perl.pl Oracleに付属の後処理用EXECアクションの例の、Perlバージョンのソース。このプログラムは、oblixpppcatalog.lstファイルのEXECアクションとして参照できます。
ppp_string.cpp pppexectest.cppによって使用される文字列を表示するC++クラス。
ppp_string.h ppp_string.cppのクラス宣言。
corpdir_view_pre.xml 前処理ステップとして起動される際に、アイデンティティ・システムに送信される、この例の書式設定済XMLメッセージ。pppexectest.cppの例を参照してください。

3.5.5.6 パーサーのファイル例

ディレクトリ:

Identity_install_dir/oblix/unsupported/ppp/parser_test

ファイル名 説明
MyPPPActions.cpp MYPPPActions.dllと呼ばれるDSOの一部としてロードされる、SAXParserPostActionTestという名前の関数をビルドするC++ソース・ファイル。このファイルは、ユーザー・マネージャの「プロファイル」ページで表示後処理イベントへのアクションに接続する、カタログ・エントリのWindowsとUNIXの例も含みます。この関数によって、企業ユーザーの電話番号はXXX-XXX-XXXXのパターンに置換されます。
MyPPPActions.dll このディレクトリ例のソース・ファイルのビルトイン・ダイナミック・リンク・ライブラリ(DLL)。
MyPPPAction.sln (Windowsプラットフォーム専用。)MyPPPActionsをビルドするために使用できる、Microsoft Visual C++プロジェクト・ファイルです。
MySAXhandler.cpp XMLを実際に解釈するメソッドのSAXhandlerクラスをビルドする、C++ソース・ファイル。SAXはSimple API for XMLの略語です。
MySAXhandler.hpp SAXhandlerクラスに属するメソッドを定義する、ヘッダー・ファイル。


注意:

例は、説明目的でのみ提供されています。正式な製品の一部ではないことを強調するために、例は、Oracle Access Managerディレクトリ・ツリーのサポートされないブランチにインストールされています。

3.6 アプリケーション間での使用のサポート

標準ワークフローは、ユーザー・マネージャとグループ・マネージャなど特定のアプリケーション内にのみ含まれ、ワークフローの直接の影響はそのワークフローが含まれるアプリケーションに限定されます。2つ以上のマネージャ・アプリケーションに影響を及ぼす変更をワークフローで行う必要がある場合があります。たとえば、新規ユーザーを作成し、このユーザーをグループにサブスクライブする場合です。

これを行うには、ワークフローにイベントを組み入れます。このイベントにより、ワークフローから情報を取得するアクションがトリガーされ、IdentityXML構文を使用して、タスク実行リクエストが他のアプリケーションに送信されます。フローは、次のようになります。

これを実装するためのカタログ内のイベント・エントリは、次のようになります。

63f004504f83455b924133acd0ef2e87_3_postaction;
lib;;../../../unsupported/ppp/ppp_dll/ppp_dll.dll;
NISClient;

イベント・エントリは、他のワークフロー・イベントと同じ形式です。ただし、動作に違いがあるのは、NISClient関数のためです。この関数によって、前のリストで説明したすべてのタスクが実行されます。ファイルpppdlltest.cppのNISClient関数のためのコード例と、nis_client.cppでサポートするメソッドは、どちらも次のディレクトリにあります。

Identity_install_dir/oblix/unsupported/ppp/ppp_dll

例のconf.txtファイルは次にあります。

Identity_install_dir/oblix/unsupported/ppp/ppp_dll

このファイルを使用する場合、内容をユーザーの状況に合せるよう変更し、dllによる検索対象となる場所に移動する必要があります。

Identity_install_dir/oblix/apps/common/bin


注意:

アプリケーション間にまたがるプラグインを使用する際に、時間の遅延が発生する可能性があります。たとえば、レプリケートされたディレクトリを使用する場合、第1ディレクトリに書き込まれた情報が第2ディレクトリに複製コピーされるには時間がかかります。第2ディレクトリからのデータ使用を試行する前に、プラグインで時差が許容される必要があります。

3.7

アイデンティティ・イベント・プラグインAPIの使用例は次のとおりです。

3.7.1 LIBアクション例: LogActivation

この例では、アイデンティティ・システムでのユーザーのアクティブ化/非アクティブ化の両方のロギングを実行するC関数について説明します。2つの異なるイベントに対して、同じアクション関数がカタログに登録されています。類似した方法で処理されるイベントを識別できるように、イベント名がアクションに渡されます。

例では、ログがファイル・システムに書き込まれます。さらに高度な実装では、リレーショナル・データベースに直接接続し、後から外部エンタープライズ・アプリケーションで処理するために、ユーザーのアクティブ化イベントの統計が収集されます。ただし、1つのアクション内で多くの作業をしすぎないようにする必要があります。1つのアクションに費やされる時間は、ユーザー、この場合では委任ID管理者のHTTPリクエスト待機時間に加算されるためです。

次のコードによって、この機能がLIBアクションとしてパッケージ化されて実装されます。

#include <ppp/obppp.h>
#include <ppp/obpppwf.h>
#include <ppp/obpppdata.h>

extern "C" {

/**
* LogActivation
* This action logs user activation and deactivation
* events.
* @param eventName The name of the event that
* triggered this action.
* This example processes both activation and
* deactivation, and uses this parameter to
* tell the difference.
* @param data the data for this event.
* (re: include/ppp/obpppdata.h)
* @return STATUS_PPP_OK or STATUS_PPP_ABORT
**/

unsigned int
LogActivation(const char *eventName, ObPPPData *data)
{
// Event names (must match those used in catalog)
const char *ACTIVATE_EVENT =
"userservcenter_workflowActivateSave_pre";
const char *DEACTIVATE_EVENT =
"userservcenter_workflowDeactivateUserSave_pre";
// open our file
FILE *file = fopen("activation_log.txt", "a");
// Determine whether action is being called to log
// an activate or deactivate user event.
bool activate;
if (0 == strcmp(eventName, ACTIVATE_EVENT)) {
activate = true;
} else if (0 == strcmp(eventName, DEACTIVATE_EVENT)) {
activate = false;
} else {
// error - can't process other events
data->SetResultString("PPP action misconfigured");
fclose(file);
return STATUS_PPP_ABORT;
}

const char **uid = (const char **)data->Get("uid");
if (NULL == *uid) {
data->SetResultString("PPP action error");
fclose(file);
return STATUS_PPP_ABORT;
data->SetResultString("PPP action error");
fclose(file);
return STATUS_PPP_ABORT;
}
// Write the log entry
fprintf(file, "%s: %s\n",
activate ? "activated" : "deactivated",
*uid);
fclose(file);
return STATUS_PPP_OK;
}

次の説明での参考用に、UNIXシステムのoblixpppcatalog.lstでこのアクションを構成する方法を次に示します。

userservcenter_workflowActivateSave_pre;lib;;/var/opt/netpoint/plug-ins/liblogactions.so;LogActivation;

userservcenter_workflowDeactivateUserSave_pre;lib;;/var/opt/netpoint/plug-ins/liblogactions.so;LogActivation;

LogActivation LIBアクションでは最初に、アイデンティティ・イベント・プラグインAPIヘッダー・ファイルをインクルードします。これは、すべてのLIBアクションがアイデンティティ・システム・データにアクセスするために行う必要があるからです。

LogActivationは外部Cブロック内で宣言され、外部CリンクによってCで記述されたコードであることをC++コンパイラに通知しています。

次は、このアクションの関数シグネチャです。

unsigned int
LogActivation(const char *eventName, ObPPPData *data)

このコードは、obppp.hで説明されているように、LogActivationをObActionFuncと同じ戻り型およびパラメータ・リストを持つ関数として宣言します。アイデンティティ・システムでは、すべてのLIBアクションがこの型を使用する必要があります。

次に、LogActivationがACTIVATE_EVENTおよびDEACTIVATE_EVENTの定数を宣言します。これらの定数の値は当該アクションが応答するイベントを反映しており、前に示したコードにあるように、カタログで使用される定型化イベント名と一致する必要があります。

次に、fopen()を使用して、ファイルが追加可能として開かれます。このようなファイルの例としては、ログ・ファイルがあります。ファイルはアイデンティティ・システムの現在作業中のidentity/oblix/apps/common/binディレクトリにあります。この例では、ログ・ファイルに記録されるエントリの種類は2つのみです。

  • activated: <user dn>

  • deactivated: <user dn>

次にLogActivationは、自身を起動するイベントの名前を調べ、アクティブ化/非アクティブ化フラグを設定します。次に、ObPPPDataのGetメソッドを使用してユーザーのDNを調べ、uidパラメータの値をフェッチします。このイベントに対するuidパラメータの値は、アクティブまたは非アクティブなユーザーのディレクトリDNです。


注意:

このアクションは、予期しないイベントのためにコールされたり、ObPPPDataオブジェクトで目的のデータを検索できない場合、戻りステータスをSTATUS_PPP_ABORTに設定して、ユーザー・マネージャに明確にエラーを通知します。

このアクションは、ログ・メッセージを書き込み、ログ・ファイルを閉じ、成功ステータスSTATUS_PPP_OKをユーザー・マネージャに戻して、タスクを完了します。

3.7.2 EXECアクション例: AfterHours

この例では、後処理EXECアクションによって、時間外ロックアウト機能が実装されます。この目的は、バックアップおよびその他システム・メンテナンス用に安全な環境を可能にするために、1日のうちの特定時間内、サイトにおいて特定のタイプのアクティビティを不許可にするポリシーを持つことです。このアクションは、そのようなポリシーを強制するためのツールの1つとして、管理者のツールボックスに入れておくことができます。

次は、AfterHoursアクションのソース・コードです。

#include <time.h>
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#include <stdlib.h>
#include <ppp/obppp.h>
int main(int argc, char* argv[])
{
// XML template for text message
static const char *messageTemplate =
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n \
<?xml-stylesheet href=\"../../common/ui/style0/ppp.xsl\"
type=\"text/xsl\"?>\n \
<Oblix xmlns=\"http://www.oblix.com/\">\n \
<ObTextMessage>\n \
%s\n \
</ObTextMessage>\n \
</Oblix>\n";

static const char *message;

if (argc > 1 && argv[1] != 0 && stricmp(argv[1], "pre")
== 0) {
// PRE-processing requests are not supported
return(STATUS_PPP_ABORT);
} else {
// POST-processing
// Examine command-line for any EXEC arguments
if (argc > 1 && argv[1] != 0) {
const long now = time(0);
struct tm* tmNow = localtime(&now);
int hrsNow = tmNow->tm_hour;
int minNow = tmNow->tm_min;
int hrsOff = atoi(argv[2]);
int minOff = atoi(argv[3]);
int hrsOn = atoi(argv[4]);
int minOn = atoi(argv[5]);
int timeOff = (60 * hrsOff) + minOff;
int timeOn = (60 * hrsOn) + minOn;
int timeNow = (60 * hrsNow) + minNow;
if (timeOn < timeOff) timeOn += (60*24);
if (timeOn != timeOff && timeNow >= timeOff &&
timeNow < timeOn) {
// Disallow the event; send ObTextMessage using
// text in catalog
message = argv[1];
} else {
// Allow the event. As a convenience, Identity
// applications assume actions haven't modified
// the data if they don't write to stdout. So
// all you need to do here is return status.
return STATUS_PPP_OK;
}
} else {
// No arguments. Output a default disablement message.
message = "This operation is disabled by the POST-processing action.";
}
// If we get here, we're replacing the data with
// the ObTextMessage.
fprintf(stdout, messageTemplate, message);
fflush(stdout);
return(STATUS_PPP_OK);
}
}
Here is a sample Catalog entry to configure the AfterHours action on a Windows server.
userservcenter_view_post;exec;;C:\NetPoint\Identity\Actions\AfterHours.exe;"
This Operation is unavailable outside business hours. 
Please contact your Identity administrator for details." 21 30 06 00;

第1フィールドはアクションをユーザー・マネージャの表示後処理イベントに関連付けます。第2フィールドは空です(アイデンティティ・システム・パラメータなし)。第3フィールドは、これがEXECアクションであることを示します。第4フィールドは、AfterHoursアクションを実装する実行可能ファイルへのパスです。残りのフィールドはEXECアクションのパラメータで、argv[1]からargv[5]としてアクションに渡されます。テキスト・メッセージ・パラメータは、空白を含んでいるため、引用符で囲む必要があります。最後の4つのパラメータは、オフ時刻が21:30(9.30pm)から06:00(6.00am)までであることを示します。


注意:

ここで、アクション・パラメータの使用方法について説明します。パラメータは、EXECアクションでのみ利用可能で、LIBアクションでは利用できません。時間外ロックアウト機能を実装したLIBアクションは、オフ時間とオン時間および外部ソースから表示されるテキスト・メッセージを参照する必要があります。これによって、より高度な設定が可能になります。ホーム・セキュリティ・タイム・スイッチのように、管理者は、1日に複数回のオフ期間を設定したり、週末に異なるスケジュールを設定することができます。アクション・インタフェースを設計し、LIBアクションとEXECアクションのどちらをコールするかを決定するには、要件を理解することが役に立ちます。

AfterHoursアクションは、イベントが現在無効化されている場合、最初に、ブラウザにテキスト・メッセージを戻すために使用されるXML文書を含む文字列を宣言します。文字列には、%sが埋め込まれています。この文字列は、fprintfに渡すためのテンプレートとして使用されています。すなわち、%sはprintfのディレクティブで、実際のメッセージによって置き換えられます。

次に、このアクションは、前処理イベントからコールされますが、コールを拒否します。前処理をサポートしない理由は、前処理の後になるまではリクエストのXML結果が生成されないため、リクエストのXML結果に対して意味のある置換ができないためです。

AfterHoursにより、次に時間が計算されます。この計算のために、システム時間がチェックされ、現在の時間と分が抽出されます。次に、これが分単位のみに変換されます。その後、コマンドライン引数が調べられ、カタログに付属のメッセージ、オフの時間および分、オンの時間および分が、argv[1]からargv[5]として、この順番で抽出されます。

再度、時間が分に変換されます。オン時間がオフ時間よりも早い時刻になっている場合、オン時間はその翌日に含まれるため、オン時間に24時間(24 * 60分)が加算されます。オン時間とオフ時間が同じ場合、AfterHoursによりリクエストが有効化されます。今の時刻がオフ時間とオン時間の間に入ると、メッセージ・テンプレートに出力するためargv[1]が選択されます。今の時刻がこの期間外にある場合、AfterHoursによって単にSTATUS_PPP_OKが戻され、イベントが続行できることが示されます。

イベントを許可しないようにするには、fprintfをコールする際に、メッセージ・テンプレートとともに、選択したメッセージを指定すると、出力がSTDOUTに送信されます。アクションは、イベントの続行を許可する場合は、STATUS_PPP_OKを戻します。ユーザー・マネージャによって、アイデンティティ・システムの一部であるstylesheet ppp.xslが適用され、テキスト・メッセージを含む結果ページがブラウザに戻されます。

3.7.3 MANAGEDLIBアクション例

次は、EventAPIクラスを宣言するサンプル・ヘッダー・ファイルです。

// managed_ppp.h

#ifndef __managed_ppp__
#define __managed_ppp__

#using <mscorlib.dll>
#using <pppinterface.dll>
#using <System.dll>
#using <System.Xml.dll>

using namespace System;
using namespace System::Text;
using namespace System::Collections;
using namespace System::Xml;
using namespace System::Net;
using namespace System::IO;
using namespace Oblix::Identity::CoreID;

/* Singleton class that contains methods specified as Identity Event API actions.
The Identity System will instantiate one EventAPI object, which will be shared among threads.
Class members must be accessed in a thread-safe manner. 
Modification of data members must be synchronized.

The class must be named EventAPI and must define a constructor and destructor
*/

public __gc class EventAPI {

public:
/* ctor, initialize class members here */
EventAPI( );
/* dtor, release resources here */
virtual ~EventAPI( );

/* action methods */
IPPPData::STATUS_PPP_M PreProcessingTest( String * eventName, IPPPData * data );
IPPPData::STATUS_PPP_M PostProcessingTest( String * eventName , IPPPData * data );
IPPPData::STATUS_PPP_M PostProcessingTest_Phone( String * eventName, IPPPData * data );
IPPPData::STATUS_PPP_M SavePreProcessing( String * eventName, IPPPData * data );
IPPPData::STATUS_PPP_M WorkflowPreActionTest( String * eventName, IPPPData * data );
IPPPData::STATUS_PPP_M WorkflowPostActionTest( String * eventName , IPPPData * data );
IPPPData::STATUS_PPP_M WorkflowPostActionPasswordTest( String * eventName, IPPPData * data );
IPPPData::STATUS_PPP_M WorkflowExtActionTest( String * eventName, IPPPData * data );
IPPPData::STATUS_PPP_M WorkflowSubflowActionTest( String * eventName, IPPPData * data );
IPPPData::STATUS_PPP_M PasswordTest( String * eventName, IPPPData * data );
IPPPData::STATUS_PPP_M WorkflowRetryTest( String * eventName, IPPPData * data );
IPPPData::STATUS_PPP_M NISClient( String * eventName, IPPPData * data );
IPPPData::STATUS_PPP_M ProcessCPResponseEncryption( String * eventName, IPPPData * data );
IPPPData::STATUS_PPP_M USCOnChange( String * eventName, IPPPData * data );
IPPPData::STATUS_PPP_M NavigationTest( String * eventName, IPPPData * data );

private:
String * MakePayload( IPPPData * data, String * login, 
String * password, String * group , String * user );
};


public __gc class XMLUtil {
public:
static String * XMLUtil::knewline = S"\n";
static String * XMLUtil::kSpace = S" ";
static String * XMLUtil::kCloseAngle = S">";
static String * XMLUtil::kProcessingInst = S"<?xml version=\"1.0\"?>";
static String * XMLUtil::kSoapEnvEnvelopeStart = S"<SOAP-ENV:Envelope";
static String * XMLUtil::kSoapEnvEnvelopeEnd = S"</SOAP-ENV:Envelope>";
static String * XMLUtil::kxmlns = S"xmlns:oblix=\"http://www.oblix.com\" 
xmlns:SOAP-ENV=\"http://schemas-xmlsoap.org/soap/envelope/\"";
static String * XMLUtil::kSoapEnvBodyStart = S"<SOAP-ENV:Body>";
static String * XMLUtil::kSoapEnvBodyEnd = S"</SOAP-ENV:Body>";
static String * XMLUtil::kOblixAuthStart = S"<oblix:authentication ";
static String * XMLUtil::kOblixAuthEnd = S"</oblix:authentication>";
static String * XMLUtil::kTypeBasic = S"type=\"basic\"";
static String * XMLUtil::kObLoginStart = S"<oblix:login>";
static String * XMLUtil::kObLoginEnd = S"</oblix:login>";
static String * XMLUtil::kObPasswordStart = S"<oblix:password>";
static String * XMLUtil::kObPasswordEnd = S"</oblix:password>";
static String * XMLUtil::kObReqStart = S"<oblix:request";
static String * XMLUtil::kObReqEnd = S"</oblix:request>";
static String * XMLUtil::kApp = S"application=\"groupservcenter\"";
static String * XMLUtil::kfuncname = S"function=\"subscribeUserToGroup\"";
static String * XMLUtil::kObParamsStart = S"<oblix:params>";
static String * XMLUtil::kObParamsEnd = S"</oblix:params>";
static String * XMLUtil::kObParamStart = S"<oblix:param";
static String * XMLUtil::kObParamEnd = S"</oblix:param>";
static String * XMLUtil::kNameEqproxysourceuid = S"name=\"proxysourceuid\"";
static String * XMLUtil::kNameEquid = S"name=\"uid\"";

};

#endif

クラスには複数のアクション・メソッドがあります。次のディレクティブを注目してください。

#using <pppinterface.dll>

このディレクティブは、プラグインで、ステータス・コードのみでなく、pppInterface.dllからの日付タイプ、すなわち、IPPPDateインタフェースが使用されることを示します。初期化コードはコンストラクタEventAPI()に、クリーンアップ・コードはデストラクタ~EventAPI()に配置する必要があります。

サンプルのプラグインでは、ディレクティブによる指示どおり、System.Xmlライブラリに含まれるデータ型も使用されます。

#using<System.Xml.dll>

メソッドEventAPI::NISClientは、.NETフレームワークSDKの一部であるSystem.Xmlのクラスを使用し、SOAPリクエストを送信する方法の一例です。このメソッドはターゲット・ユーザーをグループへサブスクライブします。ターゲット・ユーザーはIPPPDate::Getを介して取得されますが、ユーザーのサブスクライブ先のグループを含む他のパラメータは、構成ファイルparams.xmlから取得されます。

メソッドEventAPI::NISClientはこれらのパラメータを使用して、EventAPI::MakePayLoadメソッド(ここにはリストされておらず、サンプル・コード内にあります)でSOAPリクエストを作成します。次に、HttpWebRequestを使用して、URIをパラメータとするHTTPリクエストを作成します。次に、そのリクエストからのストリームを取得し、このストリームにSOAPリクエスト(IdentityXML/subscribeUserToGroup)を書き込みます。その後、このメソッドはリクエストによるレスポンスを取得します。

IPPPData::STATUS_PPP_M
EventAPI::NISClient( String * eventName, IPPPData * data )
{
IPPPData::STATUS_PPP_M retStatus = IPPPData::STATUS_PPP_M::STATUS_PPP_OK;

try {
String * sUidParamName = S"proxysourceuid";
String * sGroupDNParamName = S"uid";
String * uri, * login, * password, * group, * user;
String * errMsg = S"Missing Parameter";

String * targets[] = data->Get( S"WfInstance.obtargetdn" );
user = targets[0];
XmlDocument& doc = *new XmlDocument;
doc.Load( S"params.xml" );
XmlNode * root = doc.FirstChild;
XmlElement * elem;
elem = root->get_Item( S"uri" );
if( elem != NULL ) { uri = elem->InnerText; } else { throw new Exception( errMsg ); }
elem = root->get_Item( S"login" );
if( elem != NULL ) { login = elem->InnerText; } else { throw new Exception( errMsg ); }
elem = root->get_Item( S"password" );
if( elem != NULL ) { password = elem->InnerText; } else { throw new Exception( errMsg ); }
elem = root->get_Item( S"group" );
if( elem != NULL ) { group = elem->InnerText; } else { throw new Exception( errMsg ); }

String * sPayLoad = MakePayload( data, login , password , group , user);
XmlDocument& soapReq = *new XmlDocument;
soapReq.LoadXml( sPayLoad );

HttpWebRequest * req = static_cast<HttpWebRequest*>( WebRequest::Create( uri ) );
req->ContentType = "text/xml;charset=\"utf-8\"";
req->Accept = "text/xml";
req->Method = "POST";

Stream * stm = req->GetRequestStream( );
soapReq.Save( stm );
stm->Close( );

WebResponse * resp = req->GetResponse( );

}
catch( Exception * e ) {
data->SetResultString( e->ToString( ) );
retStatus = IPPPData::STATUS_PPP_M::STATUS_PPP_ABORT;
}

return retStatus;
}

Parameter File:

params.xml
<Root>
<uri>http://sdelaney/identity/oblix/apps/groupservcenter/bin/groupservcenter.cgi</uri>
<login>admin</login>
<password>oblix</password>
<group>cn=Group of Employees10k1 with 1000 members, ou=Corporate, o=Company,c=US</group>
</Root>