Oracle APEXとしては非推奨となっているのですが、アプリケーションごとのSAML認証の設定を試してみました。Azure ADをIdPとして使っています。
認証スキームのスキーム・タイプにSAMLサインインを選択し、設定のSAML属性の使用としてアプリケーション[非推奨]を選択します。
設定手順は、インスタンス単位での手順を参照していただくこととし、異なる点を説明します。
アイデンティティ・プロバイダのシングル・サインオンURL = ログインURL
アイデンティティ・プロバイダのシングル・サインアウトURL = ログアウトURL
アイデンティティ・プロバイダの発行者 = Azure AD識別子
アイデンティティ・プロバイダの署名証明書は、Azure ADよりダウンロードした証明書を貼り付けます。形式はBase64を選択します。
署名リクエストの資格証明ストアとしてワークスペースのWeb資格証明として作成した、証明書と秘密キーのペアを保存している資格証明を指定します。
アプリケーション・ビルダーのワークスペース・ユーティリティを開きます。
ワークスペース・ユーティリティのWeb資格証明を開きます。
以前のAPEXのバージョンでは、共有コンポーネントにWeb資格証明へのリンクが含まれていた覚えがあるのですが、現行のバージョンでは資格証明へのリンクは右隅に移動しています。
Web資格証明の属性として名前を設定します。ここで指定した名前をSAMLの設定の署名リクエストの資格証明ストアとして指定します。
認証タイプとして証明書/秘密キーのペアを選択します。証明書/秘密キーのペアはopensslを使って生成します。手順については、Oktaの記事に記載しています。
認証タイプとして証明書/秘密キーのペアを選択します。証明書/秘密キーのペアは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アプリケーションを対象としたメタデータではないので注意が必要です。
完