2022年7月14日木曜日

アプリケーションごとのSAML認証を試してみる

 Oracle APEXとしては非推奨となっているのですが、アプリケーションごとのSAML認証の設定を試してみました。Azure ADをIdPとして使っています。

認証スキームスキーム・タイプSAMLサインインを選択し、設定SAML属性の使用としてアプリケーション[非推奨]を選択します。

設定手順は、インスタンス単位での手順を参照していただくこととし、異なる点を説明します。


設定アイデンティティ・プロバイダのシングル・サインオンURLアイデンティティ・プロバイダのシングル・サインアウトURLアイデンティティ・プロバイダの発行者は、インスタンスでの設定と同様に、Azure ADのエンタープライズ・アプリケーションの以下の情報を参照します。対応は以下になります。

アイデンティティ・プロバイダのシングル・サインオンURL = ログインURL
アイデンティティ・プロバイダのシングル・サインアウトURL = ログアウトURL
アイデンティティ・プロバイダの発行者 = Azure AD識別子


アイデンティティ・プロバイダの署名証明書は、Azure ADよりダウンロードした証明書を貼り付けます。形式はBase64を選択します。


署名リクエストの資格証明ストアとしてワークスペースのWeb資格証明として作成した、証明書と秘密キーのペアを保存している資格証明を指定します。

アプリケーション・ビルダーワークスペース・ユーティリティを開きます。


ワークスペース・ユーティリティWeb資格証明を開きます。


以前のAPEXのバージョンでは、共有コンポーネントWeb資格証明へのリンクが含まれていた覚えがあるのですが、現行のバージョンでは資格証明へのリンクは右隅に移動しています。


Web資格証明属性として名前を設定します。ここで指定した名前をSAMLの設定署名リクエストの資格証明ストアとして指定します。

認証タイプとして証明書/秘密キーのペアを選択します。証明書/秘密キーのペアはopensslを使って生成します。手順については、Oktaの記事に記載しています。


APEX側の設定は以上です。Azure ADのIdP自体は、インスタンス単位かアプリケーションごとかに関わらず同じなので、設定に大きな違いはありません。

APEXのアプリケーションごとにSAML認証を設定する場合、Azure AD側の基本的なSAML構成は、以下のように変わります。

SP(サービス・プロバイダ)はAPEXのインスタンスではなくAPEXアプリケーションであるため、識別子(エンティティID)サインオンURLはインスタンスを示すURLから、アプリケーションを示すURLに変更します。応答URL(Assertion Consumer Service URL)は、SAMLコールバックとなるURLで、こちらはインスタンス・レベルと同じURLを指定します

識別子:   https://ホスト名/ords/f?p=アプリケーションID
応答URL: https://ホスト名/ords/apex_authentication.saml_callback
サインオンURL: https://ホスト名/ords/f?p=アプリケーションID


インスタンス・レベルでのSAML認証の設定と、アプリケーションごとのSAML認証の設定の違いは以上になります。

Azure ADのエンタープライズ・アプリケーションとAPEXアプリケーションが1対1で登録されているため、インスタンス・レベルでのSAML認証と異なり、IdPからAPEXアプリケーションにサインインすることができます。

つまり、Azure ADでSAML認証を構成したときの最後のステップであるTestも成功します。


Oracle APEXでは、パッケージAPEX_AUTHENTICATIONに含まれるSAML_METADATAというプロシージャを呼び出すことにより、SPのメタデータを取得できます。

https://ホスト名/ords/apex_authentication.saml_metadata


引数p_app_idアプリケーションIDを指定することにより、APEXアプリケーションごとのSAML SPのメタデータが取得できるはずなのですが、エラーが発生します。おそらく不具合と思われますが、エンティティIDやログインURLはメタデータを参照しなくても分かるため、問題にはならないでしょう。

https://ホスト名/ords/apex_authentication.saml_metadata?p_app_id=アプリケーションID


アプリケーションの認証スキームとしてSAMLが構成されていないと、アプリケーションIDを指定してもインスタンス・レベルの構成情報が返されます。SAML_METADATAの呼び出しが正常終了していても、エンティティIDの末尾がsaml_callbackとなっている場合は、APEXアプリケーションを対象としたメタデータではないので注意が必要です。