Java での SAML アサーションのカスタマイズ

企業は、連係されたパートナー間のビジネス契約に基づいてアサーションのコンテンツを変更できます。たとえば、あるパートナーは、アサーションで属性に対する使いやすい名前相当物を要求することができます。または、あるパートナーは、アサーションに各属性の XML タイプ指定を含めるよう選ぶことができます。
casso11jp
企業は、連係されたパートナー間のビジネス契約に基づいてアサーションのコンテンツを変更できます。たとえば、あるパートナーは、アサーションで属性に対する使いやすい名前相当物を要求することができます。または、あるパートナーは、アサーションに各属性の XML タイプ指定を含めるよう選ぶことができます。
Single Sign-On
 は AssertionGeneratorPlugin.java インターフェースの実装で SAML アサーションを作成します。アプリケーション開発者は、既存の実装クラスを上書きすることでアサーションのコンテンツを増強できます。
以下の図は、カスタム アサーション ジェネレータ プラグインを作成する過程を示します。
customize assertion with plugin
SAML アサーションをカスタマイズする過程にはこれらの手順が含まれます。
Java アサーション ジェネレータ プラグイン インターフェースの実装
AssertionGeneratorPlugin.java インターフェースを実装することでカスタム アサーション ジェネレータ プラグインを作成します。実装クラスに関する最小要件を以下に記載します。
以下の手順に従います。
  1. パラメータが含まれない公のデフォルト コンストラクタ メソッドを提供します。
  2. 実装がステートレスであることを確実にするのに役立つコードを提供します。その結果、多くのスレッドが単一のプラグイン クラスを使用できます。
  3. customizeAssertion メソッドへのコールを含めます。
    この例では、アプリケーション開発者が使いやすい名前属性を作成するために handler.updateNameID を定義していると仮定します。
    /**
         * <p>Performs Assertion Generator callout functionality to customize the
         * SAML assertion in the <code>AssertionGeneratorPlugin</code> object and
         * returns a result.</p>
         * @param apiContext     A context object that provides methods for sending
         *                       log, trace, and error messages to the Policy Server. Use the APIContext.getAttrMap() method to retrieve attributes posted by the application specified in the Application URL.
         * @param userContext    A context object that allows a custom object to set
         *                       and retrieve information about a user in a user
         *                       directory. The information includes user
         *                       attributes and directory attributes associated
         *                       with the user.
         * @param pluginParam    The string for Assertion plug-in parameters. 
         * @param inputAssertion    The current XML token representing the SAML Assertion.
         * @param outputAssertion   The final XML token representing the SAML Assertion.
         * @return  0 if assertion is customized successfully, or -1 if no customization or an error occurred.
         * If the method fails, the outputAssertion is ignored.
         * @throws java.lang.Exception For cases when the customization terminates unexpectedly.
         *
         **/
        public int customizeAssertion(APIContext apiContext, UserContext userContext,String pluginParam,
         String inputAssertion, final StringBuffer outputAssertion) throws Exception {
            if (inputAssertion == null || inputAssertion.equals("")) {
                // Indicates non-zero for an error.
                apiContext.trace(PLUGIN_TAG, "Received null or empty response for customization");
                return -1;
            }
            apiContext.trace(PLUGIN_TAG, "Entering customizeAssertion");
            StringBuffer newAssertion = new StringBuffer(inputAssertion);
            try
            {
                Saml1AssertionHandler handler =
                    initHandler(apiContext, userContext);
                handler.updateNameID(newAssertion);
                handler.addAttributes(pluginParam, newAssertion);
            }
            catch(Throwable th)
            {
                apiContext.error("SAML1AssertionSample: " + th.getMessage());
                StringWriter writer = new StringWriter();
                th.printStackTrace(new PrintWriter(writer));
                writer.flush();
                apiContext.trace(PLUGIN_TAG,
                                 "Error customizing Assertion:\n" + writer.toString());
                apiContext.trace(PLUGIN_TAG, "Done customizeAssertion");
                return -1;
            }
            outputAssertion.append(newAssertion);
            apiContext.trace(PLUGIN_TAG, "Done customizeAssertion");
            // return "success"
            return 0;
        }
    : 構文要件および customizeAssertion メソッドへ渡されるパラメータ文字列の使用は、カスタム オブジェクトの責任です。
アサーション ジェネレータ プラグインの展開
AssertionGeneratoPlugin.java インターフェースの実装クラスをコード化した後、それをコンパイルし、
Single Sign-On
が実行可能ファイルを検出できることを確認します。
以下の手順に従います。
  1. 以下のいずれかの方法でアサーション ジェネレータ プラグイン コードをコンパイルします。
    • サンプル プラグインを使用している場合は、ビルド スクリプトを使用してプラグインをコンパイルします。ビルド スクリプトは、
      install_directory
      \sample ディレクトリにインストールされます。ビルド スクリプトは次のとおりです。
      Windows:
      build_plugin.bat
      UNIX:
      build_plugin.sh
      コンパイルされたサンプル プラグイン fedpluginsample.jar は、
      install_directory
      \jar ディレクトリにあります。
    • 自分のプラグインを書き込む場合は、プラグインをコンパイルするときに smapi.jar をインクルードします。
  2. JVMOptions.txt ファイルで、プラグインのクラスパスをインクルードするように、-Djava.class.path 値を変更します。\siteminder\config ディレクトリの JVMOptions.txt ファイルを特定します。
    任意のディレクトリにプラグイン jar を配置し、JVMOptions.txt ファイルがそれを参照するよう設定できます。サンプル プラグインを使用するには、fedpluginsample.jar を参照するようクラスパスを変更しますが、smapi.jar 用のクラスパスは変更しないでください。
    注:
    プラグインで Apache Xerces または Xalan を使用するには、プロトコルでインストールされた Xerces または Xalan のバイナリ ファイルを使用します。互換性の理由でこれらのファイルを使用する必要があります。
  3. サービスを再起動します。
    サービスを再起動することにより、フェデレーション システムがアサーション ジェネレータ プラグインの最新バージョンを必ず使用するようにします。
UI 内のアサーション ジェネレータ プラグインの設定
アサーション ジェネレータ プラグインを設定するには、管理 UI で設定に対して値を指定します。
: プラグインを展開するまで、プラグイン設定を行わないでください。
以下の手順に従います。
  1. 管理 UI にログオンします。
  2. 変更するパートナーシップのパートナーシップ ウィザードのアサーション設定手順に移動します。
  3. 次のフィールドに値を入力します。
    • プラグイン クラス
      プラグインの Java クラス名を指定します。名前を入力します。このプラグインはランタイムで呼び出されます。
      例: com.mycompany.assertiongenerator.AssertionSample
      プラグイン クラスは、アサーションの解析および変更を行った後、最終的な処理のために結果をフェデレーション システムに返すことができます。各依存パーティのアサーション ジェネレータ プラグインを指定します。コンパイルされたサンプル プラグインは、ディレクトリ
      install_directory
      /jar に含まれています。
    • プラグイン パラメータ
      (オプション)。フェデレーション システムがランタイムでパラメータとしてプラグインへ渡す文字列を指定します。文字列にはあらゆる値を含めることができ、従う特定の構文はありません。
      プラグインは、受信するパラメータを解釈します。たとえば、パラメータは属性の名前です。または、文字列には、何かを実行するようにプラグインに命令する整数を含めることができます。
アサーション ジェネレータ プラグインは、コード化およびコンパイルされ、配置済みです。アサーション ジェネレータは、フェデレーション パートナーによって定義された、強化されたアサーションを作成します。