Oktaを使ったSAMLのシングル・サインオンの設定ができたので、さらに追加の構成を確認してみました。
OktaのグループをAPEXのダイナミック・グループとする
Okta側でユーザーが所属しているグループを、APEXアプリケーションのサインイン時にダイナミック・グループとして登録します。結果として、Okta側での所属グループでAPEXアプケーションの認可を制御することができます。
Oktaの設定画面を開き、DirectoryのGroupsよりグループを作成します。Everyoneは最初から作成されているので、今回はAdministratorというグループを追加で作成しています。
Add Groupをクリックし、グループAdministratorを作成します。その後、作成されたグループAdministratorを開きます。
グループに含めるユーザーをNot Membersから+をクリックして、Membersへ移動します。
ユーザーをグループに含めたら、Saveをクリックします。
サインインの際に、Okta(IdP)からSP(APEX)に送信されるレスポンスに、グループの情報を含めます。ApplicationのSAML Settingsに含まれるGROUP ATTRIBUTE STATEMENTSに設定を追加します。
Applicationsを開いて、作成済みのSP(前回の記事ではapexとして作成)を開きます。GeneralタブのSAML SettingsのEditをクリックします。
General Settingsは変更せず、Nextをクリックします。
次に開く画面のGroup Attribute Statements (optional)にて、Nameにgroups、Name formatをBasic、Filterは正規表現と一致を選択して.*を指定します。
設定を行った後にPreview the SAML Assertionsをクリックし、設定した結果を確認します。
Assertionの内容が表示されます。NameIDとして表示されているユーザーが所属しているグループが、Attributeとして含まれていることを確認します。
Okta側で必要な変更は以上になります。Nextをクリックしてこの画面の変更を確定し、最後にSaveを実行して変更を保存します。
続いて、Oktaが送信してくるレスポンスからグループを取り出し、ダイナミック・グループを設定する処理をAPEX側に設定します。
ダイナミック・グループを設定するコードは以下になります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
procedure assign_dynamic_groups | |
is | |
C_NAMESPACE constant varchar2(50) := 'xmlns="urn:oasis:names:tc:SAML:2.0:assertion"'; | |
C_XPATH constant varchar2(50) := '//Attribute[@Name="groups"]/AttributeValue'; | |
l_saml_response sys.xmltype; | |
l_doc dbms_xmldom.domdocument; | |
l_groups dbms_xmldom.domnodelist; | |
n dbms_xmldom.domnode; | |
cn dbms_xmldom.domnode; | |
len number; | |
v varchar2(80); | |
vs apex_t_varchar2; | |
begin | |
-- SAMLResponseはAPEX_APPLICATION.G_X01として渡される。 | |
l_saml_response := xmltype(apex_application.g_x01); | |
-- AttributeタグでName=groupsの子要素AttributeValueを取り出す。 | |
l_doc := dbms_xmldom.newdomdocument( | |
l_saml_response.extract(C_XPATH, C_NAMESPACE) | |
); | |
-- XMLTYPEからDOMDocumentに変換する。 | |
l_groups := dbms_xmldom.getelementsbytagname(l_doc, '*'); | |
-- 所属しているグループの数をlenに取り出す。 | |
len := dbms_xmldom.getlength(l_groups); | |
for i in 0 .. (len -1) | |
loop | |
n := dbms_xmldom.item(l_groups, i); | |
cn := dbms_xmldom.getfirstchild(n); | |
v := dbms_xmldom.getnodevalue(cn); | |
apex_debug.info('Dynamic Group Assigned = ' || v); | |
apex_string.push(vs,v); | |
end loop; | |
-- ダイナミック・グループを有効にする。 | |
apex_authorization.enable_dynamic_groups(vs); | |
end assign_dynamic_groups; |
APEXアプリケーションのSAMLサインインの認証スキームを開き、ソースのPL/SQLコードに上記のコードを記載します。
ログイン・プロセスの認証後のプロシージャ名に、ソースに記述したプロシージャassign_dynamic_groupsを設定します。
以上で、APEXアプリケーション側の設定も完了です。
ダイナミック・グループが正しく設定されているか確認するために、SAML認証の確認のために作成したアプリケーションsamltestに、対話モード・レポートのリージョンを作成します。
識別のタイトルはダイナミック・グループとします。ソースの表名にAPEXの標準ビューAPEX_WORKSPACE_SESSION_GROUPSを指定します。
対話モード・レポートを追加したので、アプリケーションを実行します。Oktaでサインインしたのち、アプリケーションのホーム・ページが表示されます。
Group NameとしてAdministratorおよびEveryoneがリストされていれば、正しく設定できています。
シングル・サインアウトを設定する
アプリケーションからサインアウトを実行します。
Oktaではサインアウトがエラーになり、以下の画面が表示されます。
このエラーを回避するために、Okta側でシングル・サインアウトの設定を行います。
アプリケーションのSAML Settingsを編集します。Advanced Settingsを開き、Enable Single LogoutのAllow application to initiate Single Logoutにチェックを入れます。Single Logout URL、SP Issuer共に、APEX側のSAMLコールバックURLを設定します。apex_authentication.saml_callbackで終わるURLで、このアプリケーションのSingle sign on URLおよびAudience URI(SP Entity ID)として設定しているURLと同一のURLです。
Signature Certificateとして、APEX側の内部およびワークスペース・アプリケーション用のSAML: APEX属性の証明書として設定した証明書を設定します。以前の記事通りの手順であれば、cert-test.pemとして生成した証明書になります。
Okta側で生成されたSingle Logout URLを確認します。アプリケーションのSign Onタブを開いて、SAML SetupのView SAML setup instructionsを開きます。
②のIdentity Provider Single Logout URLをコピーし、APEX側に設定します。
APEXの認証制御のSAMLの設定画面を開き、一番下にあるサインアウトURLに上記のURLを設定します。
以上でシングル・サインアウトの設定は完了です。
APEXアプリケーションからサインアウトを実行すると、Oktaのログイン画面に戻ります。
Oracle APEXのSAML認証でOktaをIdPに使用するにあたって、利用可能な追加設定の説明は以上になります。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完