国産IDaaS Exticを使ってみる 2. SAML SSO

[前回](https://qiita.com/ahra_/items/c0842c03d011d0917721)の続きです。
## ExticにおけるSSO
Exticでは汎用のSSOプロトコルとしてSAMLとOIDCに対応しています。
この他、専用ブラウザ拡張を使用した代理認証方式のSSOにも対応しています。
今回の記事では、SAMLを使ったSSOについて検証します。

## SP起点のSSO
### 設定
SAMLのSPには以下のサイトを使用します。
https://sptest.iamshowcase.com/instructions#spinit
まずは「DOWNLOAD METADATA」ボタンを押下してメタデータを入手します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/d11347ab-7786-3821-1293-b401a26d4cc8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/e13eb099-99f5-d05c-a62a-445ec1675ac2.png)
管理コンソール > アプリケーション > 使用可能から「シングルサインオン (SAML)」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/87a45479-b689-46e3-6c99-b0958be73c92.png)
表示名とメタデータから入手したエンティティID、エンドポイントURLを設定します。
NameIDフォーマットに`Unspecified` `EmailAddress` `Persistent`を、SAML NameIDにExticの各属性を指定できますが、今回は`Unspecified` - `ユーザー名`を使用します。
署名はレスポンス全体を指定し、SP起点のフローとします。
また、ExticのメールアドレスをSAMLアサーションの`email`属性としてマッピングします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/31b9c614-4da2-a275-4c89-3acabe3b0783.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/cb31fcc8-22b6-5bb3-19c2-57a27e9a8b9f.png)
設定後、SAML IdPメタデータをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/01a2ee67-d8ba-4ee1-cb47-e985e00ef756.png)
ダウンロードしたメタデータをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/7c1c636e-d138-a2d1-af93-2b6931b7d864.png)
URLが生成されるので、メモします。
![スクリーンショット 2024-12-25 173128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/cc8e699f-0c69-a2ff-5eda-f5df5ad19ffb.png)
最後に、設定したSSOを利用するユーザーの設定にて、アプリケーションを「使用する」設定にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/b127e11c-35b3-a9ec-8c8b-4c66aaa38e80.png)
### 確認
以下のようなユーザーでExticにログインしている状態で、先ほど生成されたURLにアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/57dd4f4a-72cc-6198-a919-39da5abd2793.png)
すると、SAMLによるSSOが実行され、Exticの認証情報でログインしている状態になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/cb7bfa9b-3e1c-7613-e2d8-c2e804ab3796.png)
マッピングした属性値も確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/02bde78a-5206-bbad-921f-3341dd4e3e56.png)
Exticログアウト状態でアクセスすると、Exticのログイン画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/8aca70c0-94bc-5065-f281-896703ee227c.png)
ログインすると、先ほどと同じようにテストページが現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/dc4b0ca2-24b9-9d56-0dc6-bfe108de815e.png)
## IdP起点のSSO
SAMLにはユーザーがSPにアクセスし、IdPによる認証を受けることでSSOが実現されるSP起点のSSOの他、既に認証済みのIdPからSPにアクセスすることでSSOを行うIdP起点のSSOがあります。
次はこのIdP起点のSSOについて検証します。
SPには以下を使用します。
https://sptest.iamshowcase.com/instructions#start
先ほどと同じように、メタデータをダウンロードして「シングルサインオン (SAML)」の設定を行います。
認証フローは「IdP起点」にします。
今回はポータルからSPにアクセスするので、表示名とカスタムロゴも設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/f66b6077-abea-5738-3883-4617611d46db.png)
「アカウント有効」属性の値を`AccountEnabledFlag`に格納することとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/4afafc98-7c0d-83e6-dc7d-af0ff5402e27.png)
ユーザーの編集画面で設定したアプリケーションを「使用する」設定にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/493eca25-62f9-581c-0901-c8212f5bb99b.png)
### 確認
Exticにログインします。
ポータル画面に表示されているアプリケーションの表示名、カスタムロゴが設定どおりになっています。
これを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/36ec2d2e-c0d5-898e-b8d5-7aac749d4b36.png)
SSOすることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/5027f449-dfd2-96f3-4bd0-68db669dad22.png)
属性`AccountEnabledFlag`が設定されていることもわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/3903176e-ddea-4b61-1bfa-e1b535111094.png)
## 
ExticでのSAMLを使ったSSOはこのように実現されます。
[次回](https://qiita.com/ahra_/items/5467c532c80fc4a0bd7b)はOIDCを使ったSSOを検証します。