Entra External ID (CIAM) に Azure AD B2C を外部 OIDC IdP として追加してみた

# はじめに
Azure Active Directory B2C (以降 Azure AD B2C) の後継ソリューションとして Microsoft Entra External ID in external tenants (以降 CIAM) が今年の5月に GA しました。GA 当時は、Azure AD B2C と比較して CIAM の機能不足は否めない状況でしたが、GA 以降、機能が徐々に追加されています。最近では以下の機能が追加されています。

-  MFA(多要素認証)として SMS が利用可能(11月 GA)

https://learn.microsoft.com/en-us/entra/external-id/customers/concept-multifactor-authentication-customers

- Add OpenID Connect as an external identity provider (preview)

https://learn.microsoft.com/en-us/entra/external-id/customers/how-to-custom-oidc-federation-customers

今回は、先日 Preview 機能としてリリースされた外部 OIDC(OpenID Connect) IdP (Identity Provider) を試してみます。

# CIAM のローカルアカウントと外部 IdP アカウント
CIAM の IdP にはローカルアカウントと外部 IdP アカウントの二つのタイプがあります。ローカルアカウントはユーザーの資格情報(サインインIDとパスワードなど)を CIAM で保持しており、認証が成功するとアプリケーション(SaaSなど)に対してトークンを発行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/ce7fcd42-baca-1c60-6c0e-69b8207f4b2f.png)

それに対して外部 IdP アカウントは以下のイメージのように CIAM で認証するのではなく外部 IdP の Facebook で認証(➀)し、認証が成功すると CIAM へトークンを発行(②)します。 CIAM は Facebook が発行したトークンを検証し問題なければ、今度は CIAM がアプリに対してトークンを発行(③)します。(この例の外部 IdP の Facebook はソーシャルサービスなのでソーシャル IdP と呼ばれています。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/de8696cb-7628-bfba-577f-c61b04d52b8d.png)

この外部 IdP による認証連携方式の場合、新しいサービス(SaaS)を使う度にパスワードを作成し、サービス毎にパスワードを入力する必要はなく、普段利用の IdP (この例だと Facebook) で認証すると新しいサービスが使えるようになります。現時点(2024年12月20日)で CIAM がサポートしている外部 IdP は以下になります。

1. Facebook
2. Google
3. Apple
4. OpenID Connect (OIDC) プロバイダー

今のところ４つの外部 IdP は全てプレビューです。最後の 4 の OIDC プロバイダーが追加されたことで 外部 IdP の選択肢が大幅に広がりました。

# Azure AD B2C を外部 IdP として構成の準備
OIDC プロバイダーには色々ありますが、今回は CIAM リリース前までは唯一の Microsoft の顧客向け認証ソリューションである Azure AD B2C を IdP として CIAM に追加してみましょう。以下のサイトには、CIAM に Azure AD B2C を OIDC Provider として追加する方法が記載されています。

https://learn.microsoft.com/en-us/entra/external-id/customers/how-to-b2c-federation-customers

Azure AD B2C テナントをお持ちでない方は以下に Azure AD B2C テナント作成方法が記載されていますので、手順に従い作成します。(Azure AD B2C テナントを作成するには Azure サブスクリプションが必要です。)

https://learn.microsoft.com/ja-jp/azure/active-directory-b2c/tutorial-create-tenant

:::note warn
Azure AD B2C の新規購入については 2025年4月末までとなっていますので、ご注意ください。
https://learn.microsoft.com/ja-jp/entra/external-id/customers/faq-customers
:::

CIAM に Azure AD B2C を外部 IdP として追加するステップは以下になります。CIAM テナントと Azure AD B2C テナントは事前に作成しておいてください。

1. カスタムポリシーの作成 (Azure AD B2C テナントで作業)
1. Entra External ID (CIAM) をアプリケーションとして登録(Azure AD B2C テナントで作業)
1. Azure AD B2C テナントを ID プロバイダーとして構成(CIAM テナントで作業)
1. ユーザーをフローを作成し外部 IdP に Azure AD B2C を選択 (CIAM テナントで作業)

構成後のイメージはこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/90c42268-722b-9da5-5cac-4bd8124b9f42.png)

### 1. カスタムポリシーの作成
今回、一番時間がかかる部分は Azure AD B2C のカスタムポリシー(Identity Experience Framework)かもしれません。ただし変更箇所は少ないので心配は不要です。

:::note info
既にカスタムポリシー作成を経験済みの方にとっては修正箇所はとても少ないです。
:::

Azure AD B2C を OIDC の外部 IdP として構成するには二つの方法があります。一つはユーザーフローでもう一つがカスタムポリシーです。ユーザーフローは Azure AD B2C の管理ポータルから GUI で比較的簡単に構成できますが、今回使用するのはカスタムポリシーです。カスタムポリシーは、XML でポリシーを作成します。ユーザーフローではなく、カスタムポリシーが必要となる理由は OIDC の ID トークンには E メール属性が必要であり、その E メール属性を ID トークンに追加するためカスタムポリシーを使用します。
以下のサイトにあるようにスターターパックをダウンロードしてカスタムポリシー作成して下さい。使用するのは一番簡単なローカルアカウントで問題ありません。

https://learn.microsoft.com/ja-jp/azure/active-directory-b2c/custom-policy-overview

https://learn.microsoft.com/ja-jp/azure/active-directory-b2c/tutorial-create-user-flows?pivots=b2c-custom-policy

https://qiita.com/skmk/items/3efdb97833a1ca6e3008

##### ID トークンに Eメール属性を追加
スターターパックを用いて標準の手順でカスタムポリシーの作成を行い、最後に Relying Party policy である B2C_1A_signup_signin の OutputClaims に以下の記述を追加します。これにより ID トークンに eメール属性が追加されます。**CIAM の外部 IdP にするためのカスタムポリシーの修正箇所**はこれだけです。

```xml:B2C_1A_signup_signin.xml
<OutputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="email">
```
カスタムポリシーの修正後、ポリシーファイルを Azure AD B2C へアップロードします。

### 2. Entra External ID (CIAM) をアプリケーションとして登録
次に Azure AD B2C テナントに CIAM をアプリケーションとして以下のように登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/bee8af31-5a91-c6ab-1e54-0859578a4d3f.png)

リダイレクト URI は**Web** を選択し、以下のようにリダイレクト先の CIAM テナントを指定します。 URL は全て小文字で入力します。
```
https://<tenant-subdomain>.ciamlogin.com/<tenant-ID>/federation/oauth2
```
または、以下の URL を入力します。
```
https://<tenant-subdomain>.ciamlogin.com/<tenant-subdomain>.onmicrosoft.com/federation/oauth2
```

登録後、アプリケーションのクライアントIDを記録しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/d806b12e-f9d7-e004-c9f7-afd7b135189d.png)


次に、左側のメニューの「管理」で、「証明書とシークレット」を選択します。
新しいクライアントシークレットを選択し、[説明]ボックスにクライアント シークレットの説明を入力します。例: "FederationWithCIAM"
[有効期限]で、シークレットが有効な期間を選択し、[追加]を選択します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/68a0d237-23d7-beb5-4ef0-0e67d06b15d6.png)

シークレットが作成されますので、**シークレットの値**を記録します。

### 3. Azure AD B2C テナントを ID プロバイダーとして構成
ここからは CIAM テナントの管理ポータルで作業をします。以下のように External Identities の すべてのプロバイダーでカスタムを選択後、新規追加から [ID Connect を開く] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/4d355d24-d3b0-bacb-81f7-c7aebf8b93de.png)

以下の [Open ID Connect を追加する] 画面が表示されます。ここで 外部 OIDC IdP として Azure AD B2C を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/5ce34029-0025-81c8-b95a-920cf7205f63.png)

以下が入力項目の説明です。

- 表示名：CIAM に表示される 外部 IdP 名 （今回は Azure AD B2C Demo IDP と入力)
- 既知のエンドポイント： Azure AD B2C の OIDC well-known エンドポイントの URL を入力します

```url:well-known endpoint
https://<your-B2C-Tenant-name>.b2clogin.com/<your-B2C-tenant-name>.onmicrosoft.com/<Policy>/v2.0/.well-known/openid-configuration
```
- 発行者URI: Azure AD B2C が発行する IDトークンの ISS (Issuser:発行者) を指定します
```
https://<your-B2C-Tenant-name>.b2clogin.com/<your-B2C-Tenant-ID>/v2.0/
```
- クライアントID: CIAM をアプリとして登録した際のアプリケーションID(クライアントID)を入力
- クライアント認証：シークレット値を使うため client_secret を選択
- クライアントシークレット： CIAM アプリ登録後に作成したシークレット値
- スコープ： OIDC のスコープとして openid profile email offline_access を指定
- 応答の種類：OAuth 2.0 Authorization Code フローを使用するため code を選択

全て入力、設定後は、「次>要求のマッピング」をクリックします。
要求のマッピングは以下のようにセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/32f1ed49-134b-4c1c-fbac-2df1001cfce5.png)

設定後、「確認および作成」をクリック後、「作成」をクリックし作成します。

### 4. ユーザーをフローを作成し外部 IdP に Azure AD B2C を選択
CIAM で認証する際にはユーザーフローを作成する必要があります。ユーザーフローの作成方法について以下のサイトをご参照ください。

https://learn.microsoft.com/ja-jp/entra/external-id/customers/how-to-user-flow-sign-up-sign-in-customers

ユーザーフローにアプリケーションを追加します

https://learn.microsoft.com/ja-jp/entra/external-id/customers/how-to-user-flow-add-application

作成したユーザーフローの外部 IdP として先ほど追加した Azure AD B2C Demo IdP をチェックし保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/7906df6c-d495-c6d4-2d23-98dee2055988.png)

# 外部 IdP Azure AD B2C IdP の認証連携テスト
ユーザーフローを実行します。ユーザーフローからコールするアプリケーションは ID トークンをデコードして表示する jwt.ms です。最終的に CIAM が発行している ID トークンが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/3aede8e3-1e61-4b82-505d-d2f69ffc9931.png)

「Run user flow」をクリックすると CIAM の認証画面が表示されます。外部 IdP として先ほど登録した 「Azure AD B2C Demo IDP でサインイン」 が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/11decd9b-2e68-a560-dcfd-04ff0a3dfb3e.png)

「Azure AD B2C Demo IDP でサインイン」をクリックすると Azure AD B2C の画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/7ab0ae77-06bc-0eb0-e224-31a85762001f.png)

Azure AD B2C に登録しているユーザーアカウントの資格情報を入力し「Sign in」をクリックすると以下のイメージのようにJSON Web Token (JWT) が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265935/46231b0f-a7c1-6b00-a9f2-c3863001e638.png)

表示された JWT トークンのクレーム iss を見ると ciamlogin.com となっており CIAM のテナントから発行されたトークンということが分かります。 また、idp クレームをみると Azure AD B2C のドメインである b2clogin.com となっておりユーザーは Azure AD B2C で認証されたことが分かります。
認証した Azure AD B2C のユーザー情報は ID トークン(JWT) を使用して Azure AD B2C から CIAM へ JIT (Just in TIme) でユーザープロビジョニングします。

# まとめ
今回は、先日プレビュー発表された CIAM の OIDC 外部 IdP 機能を Azure AD B2C で構成して動かしてみました。Azure AD B2C で認証したユーザーは安全に CIAM 上に登録されたアプリケーションを使用することが可能になります。Azure AD B2C の場合、カスタムポリシーを使わないと外部 IdP として構成できない点が少しきになりますが、一度試して頂ければ幸いです。コンシューマ向けの ID 管理システムにおいて OIDC 外部 IdP が利用できるようになると IdP の選択肢も増えます。CIAM は今後も機能が追加されていきますのでぜひ期待してお待ちください。
まだ動きがはっきりしない点もあるのですがその辺はおいおい調べていこうと思います。 :sweat_smile:

:::note info
投稿内容は私個人の意見であり、所属企業・部門とは関係ありません。また、いかなる保証を与えるものでもありません
:::