WebLogic Serverで稼働するJavaアプリケーションをOracle Identity Cloud Serviceと連携してみた

- IDCSサンプルアプリケーションのデプロイ
- WebLogicとIDCSのSAML連携

# はじめに
Oracle Cloud Infrastructure (OCI) Marketplaceで提供されているWebLogic Serverイメージを利用して、サンプルとして提供されているJavaアプリケーションと認証プラットフォームとして提供されているOracle Identity Cloud Service (IDCS) の連携を試してみました。SAML2.0を使用してOracle Identity CloudServiceをWebLogicServerと統合することで、IDCSに登録されているIDCSユーザーのWebLogic ServerでホストされているアプリケーションへのSSOが可能になります。検証に利用したWebLogicの環境構築は[前回の記事](https://qiita.com/orakurara/items/3d2eea49c791e2228e83)をご参照ください。

# 検証環境 
- WLS 14.1.1.0.210420.01 : OCI Marketplaceで提供されているOracle WebLogic Server Enterprise Edition
- macOS 10.15.7 Catalina : ビルド用のクライアント環境
- Apache NetBeans IDE 11.3 : ビルド用IDE
- JDK 1.8 : ビルド環境
- Apache Tomcat 10.0.6 : ビルド環境 (servlet-api.jar利用用途)

# edashboardアプリケーションのビルドとデプロイ
## edashboardアプリケーションのビルド
[GutHubのリポジトリ](https://github.com/oracle/idm-samples)よりIDCSのサンプルアプリケーションをダウンロードし、NetBeansよりプロジェクトのインポートを実行します。edashboardプロジェクトのLibrariesにビルド環境のservlet-api.jarを追加し、ビルドを実行します。(筆者のビルド環境ではUserBean.javaのソースファイル中でjavax.servlet.http.HttpServletRequestをjakarta.servlet.http.HttpServletRequestに変更)
~/NetBeansProjects/idm-samples-master/edashboard/dist/edashboard.warのようにWARファイルが生成されるので、生成されたWARファイルをWebLogic稼働環境のoracleユーザーがアクセス可能なディレクトリ(例: /tmp) にscpなどのツールでアップロードしておきます。

## WebLogicへのアプリのデプロイ
WebLogic Server管理コンソール左上部の**チェンジ・センター**より**ロックして編集**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/60d7bfa8-9424-b019-44ab-a0637688e598.png)
**ドメイン構造**メニューの**デプロイメント**よりデプロイメントのサマリー画面、構成タブに表示された**インストール**ボタンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/1ff25691-fde1-c662-e8d6-d0d9e085abe3.png)
事前にアップロードしたedashbord.warのファイルを選択して**次**へ、**インストール・タイプの選択**はデフォルトの**このデプロイメントをアプリケーションとしてインストールする**を選択し**次**へ、**edashboardに指定可能なターゲット**に**クラスタのすべてのサーバー**を選択し**次**へ、オプション設定はッデフォルトのまま**次**へ、追加構成画面ではデフォルトの**はい、デプロイメントの構成画面に移動します。**のまま**終了**を選択します。その後、WebLogic Server管理コンソール左上部の**チェンジ・センター**より**変更のアクティブ化**を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a9c05bff-1252-845c-5a72-b81cb1cad5b1.png)
再度、デプロイメントのサマリー画面より**edashboard**を選択し、制御タブから*edashboard*を選択して**起動**を選択します。デプロイメントの起動の画面で**はい**を選択し、デプロイメントのサマリー画面で*edashboard*の状態が*アクティブ*で、ヘルスが*OK*であることを確認した後、サンプルアプリケーションが稼働するURL、http://ComputeインスタンスのPublicIPアドレス:9073/edashboard/index.jsp# にアクセスすると、認証画面が表示されるのでユーザー名にWebLogicの管理者アカウント名 (例: weblogic)、管理者パスワードでログインして、edashboardの稼働を確認します（この時点では下記のようなAuthorization Errorの画面が表示されれば正常です）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/f6f45fe5-81df-cc99-b961-2994c0417ec1.png)

# WebLogicのSAML有効化
## WebLogicのセキュリテイ・レルムの構成
WebLogic Server管理コンソール左上部の**チェンジ・センター**より**ロックして編集**を選択します。**ドメイン構造**メニューの**セキュリティ・レルム**よりセキュリティ・レルムのサマリー画面より*myrealm*を選択します。myrealmの設定画面のプロバイダ・タブから認証プロバイダの**新規**ボタンより下記のように認証プロバイダを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/5cc2921e-423c-8d3b-47b1-3d9e42e21220.png)

---
* 新しい認証プロバイダの作成
    * 名前 : 任意　SAML2IdentityAsserter
    * タイプ　: SAML2IdentityAsserter
    
---

再度、認証プロバイダの**新規**ボタンより下記のように認証プロバイダを追加作成します。

---
* 新しい認証プロバイダの作成
    * 名前 : 任意　SAMLAuthenticator
    * タイプ　: SAMLAuthenticator
    
---

認証プロバイダの**並べ替え**ボタンより下記のような順に認証プロバイダを並べ替えます。

---
1. SAMLAuthenticator
2. SAML2IdentityAsserter
3. DefaultAuthenticator
4. DefaultIdentityAsserter

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/e342979f-91ae-108c-3a2d-f83328b16376.png)
ここで、*SAMLAuthenticator*を選択し、制御フラグを*SUFFICIENT*に変更して**保存**を選択します。次に、*DefaultAuthenticator*を選択し、制御フラグを*OPTIONAL*に変更して**保存**を選択します。その後、WebLogic Server管理コンソール左上部の**チェンジ・センター**より**変更のアクティブ化**を選択します。その後、WebLogicが稼働する検証環境をOS再起動します。


管理コンソール左上部の**チェンジ・センター**より**ロックして編集**を選択します。**環境**メニューの**サーバー**よりedashboardアプリケーションがデプロイされた管理対象サーバ(例: WLS_server_1) を選択し、設定画面より**フェデレーション・サービスタブ**内の**SAML2.0全般**を選択します。検証用なので下記のようなダミーの情報を入力し、**保存**ボタンを選択します。

---
* 一般
    * レプリケートされたキャッシュの有効化 : 無効
    * 連絡先(名):　System
    * 連絡先(姓):  Administrator
    * 連絡先のタイプ:  管理
    * 連絡先の勤務先:  Example
    * 連絡先の電話番号:  12345678901
    * 連絡先の電子メール・アドレス:  admin@example.com
    * 組織名: Example
    * 組織URL:  https://example.com
    * 公開サイトのURL: https://ComputeインスタンスのPublicIPアドレス:9074/saml2
    * エンティティID:  wlsentity
* バインド
    * 受信者チェックの有効化 : 無効

---

**フェデレーション・サービスタブ**内の**SAML 2.0サービス・プロバイダ**を選択します。**有効**にチェックし、**優先バインド**に*POST*を選択、デフォルトURLに*https://ComputeインスタンスのPublicIPアドレス:9074/edashboard/index.jsp*を入力し、**保存**ボタンを選択します。そして、管理コンソール左上部の**チェンジ・センター**より**変更のアクティブ化**を選択します。



# IDCSへサンプルアプリケーションの登録
## IDCSの管理画面へのナビゲート
OCIダッシュボードにログインし、OCIダッシュボードメニューから、**アイデンティティとセキュリティ**>**フェデレーション**にアクセスし、*OracleIdentityCloudService*を選択し、アイデンティティ・プロバイダの詳細画面を表示します。Oracle Identity Cloud Service Consoleに表示されたURLより、IDCSのサービス・コンソールにアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/4aa6acc2-5d3c-c46a-5de2-eb2510ef6736.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/e87c6ffb-9daf-b136-9d6d-d45f955472eb.png)

## IDCSグループの作成とユーザーの登録

下記のようにIDCSグループを作成し、ユーザーを割り当てていきます。

---
|IDCSグループ|edashboardアプリのJAZNロール|認可ページ|
|---|---|---|
|Employee|appemployee|Index, My Profile, and Employee Perks|
|Manager|appmanager|Index, My Profile, Employee Perks, and Management Watch|
|Security|appsecurity|Index, My Profile, Employee Perks, and Security Report|
---

IDCS管理コンソールのナビゲーション・メニューより**Groups**を選択し、**Add**ボタンより前述のグループを作成します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/51da3faa-9654-ffdd-c95d-26cfdfc9321e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/5b03cd6f-a05b-c9c6-c331-7075c9e417bd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/d8fde851-a857-1c39-a4ba-4f441403a7dc.png)
次にIDCSグループにユーザーを割り当てていきます。本記事では、自分のIDCSアカウントをManagerグループにアサインします。IDCSグループの一覧からManagerグループの詳細画面のUsersタブの**Assign**ボタンより自分のユーザーを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/dae6de67-b563-eab5-a016-088bf7c67643.png)


## IDCSへedashboardアプリの登録		

IDCS管理コンソールのナビゲーション・メニューより**Applications**を選択し、**Add**ボタンより**SAML Application**を登録します。入力項目は下記を参考ください。

---
* App Details
    * Name : Employee Dashboard
    * Description :　Intranet portal for employees
    * Application Icon :  edashboardプロジェクト内のedashboard_logo.gifをアップロード
    * Application URL:  https://ComputeインスタンスのPublicIPアドレス:9074/edashboard
* SSO Configuration (General)
    * Entity ID : wlsentity
    * Assertion Consumer URL : https://ComputeインスタンスのPublicIPアドレス:9074/saml2/sp/acs/post
* SSO Configuration (Advances Setting)
    * Include Signing Certificate in Signature : 選択
    * Logout Binding : POST
    * Single Logout URL	: https://ComputeインスタンスのPublicIPアドレス:9074/edashboard/logout
    * Logout Response URL : https://ComputeインスタンスのPublicIPアドレス:9074/edashboard
* SSO Configuration (Attribute Configuration)
    * Name : Groups
    * Format : Basic
    * Type : User Attribute
    * Value : Group Membership
    * Condition : All Groups

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a4362734-4e9a-cc17-c097-a0abc4dead0b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/f82f30ab-d669-a232-0c6a-e6ba1b93695d.png)

**Finish**ボタンよりApplicationを作成し、Employee Dashboardを選択後、Activateを行ってください。
その後、Employee Dashboardの詳細画面、**SSO Configuration**タブの**Download Identity Provider Metadata**ボタンより*IDCSMetadata.xml*をダウンロードします。さらに、**Users**タブよりEmployee Dashboardにアクセス可能なIDCSユーザーを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/5bb3af29-10f8-5e9f-7e49-7b9a7ccb9a37.png)

## WebLogicのIDPとしてIDCSを登録

先ほどダウンロードした*IDCSMetadata.xml*をWebLogic稼働環境のoracleユーザーがアクセス可能なディレクトリ(例: /tmp) にscpなどのツールでアップロードしておきます。そして、WebLogic Server管理コンソール左上部の**チェンジ・センター**より**ロックして編集**を選択します。**ドメイン構造**メニューの**セキュリティ・レルム**よりセキュリティ・レルムのサマリー画面より*myrealm*を選択します。myrealmの設定画面のプロバイダ・タブに表示される認証プロバイダの一覧から**SAML2IdentityAsserter**を選択します。さらに、**管理**タブより、**アイデンティティ・プロバイダ・パートナ**の**新規**ボタンを選択し、**新しいシングル・サインオンのアイデンティティ・プロバイダ・パートナ**を選択します。ここで**名前**に*IDCS_IDP*と入力し、先ほどアップロードしておいた*IDCSMetadata.xml*のパス (例: /tmp/IDCSMetadata.xml) を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/fdd86897-a067-bbea-4c96-a06424fafe09.png)

作成された**IDCS_IDP**を選択して、**有効**にチェック、**リダイレクトURL**に/edashboard/\*と入力して、上部の **保存** を選択して変更を更新します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/7bdd2317-5565-4075-e9e7-c37c9184a75d.png)

# IDCSとの連携のテスト

http://ComputeインスタンスのPublicIPアドレス:9073/edashboard/index.jsp# にアクセスすると、IDCSの認証画面にリダイレクトされ、ユーザー名とパスワードを入力し認証します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/56b9f820-889b-208f-f2d0-c7c11a5f9805.png)

認証に成功すると下記のような認証済のedashboardの画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/13d3bd96-641d-df24-a8b4-b4fc8f81c210.png)

ログインしたユーザーがIDCSのグループ**Security**に属している場合は全てのページを閲覧することができますが、**Manager**のグループに属しているユーザーの場合はSecurity ReportページにアクセスするとAuthorization Errorが表示されアクセスできないことを確認できます。一方で、**Employee**のグループに属しているユーザーでアクセスした場合は、Security Reportページに加えてManagement watchページにもアクセスできないことが確認できます。


# まとめ

WebLogic Server上で稼働するJavaアプリケーションとOracle Identity Cloud Service (IDCS) の連携を確認することができました。今回の検証は無償利用可能なOracle Identity CloudServiceの基本機能の範囲で実現しています。


# 関連情報
[公式ドキュメント Oracle Identity Cloud Service](https://docs.oracle.com/cd/E83857_01/paas/identity-cloud/index.html)
[Oracle Identity Cloud Service: Integrating with Weblogic Server](https://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/idcs/idcs_wls_obe/wls.html#section4)
[Identity Cloud Services and Weblogic Federation with Virtual Users and Groups](https://www.ateam-oracle.com/idcs-and-weblogic-federation-with-virtual-users-and-groups)
[GitHub: Employee Dashboard](https://github.com/oracle/idm-samples/tree/master/edashboard)