Dictav Blog

Azure Active Directory B2C

2024-01-28

サービスにユーザー認証を実装する場合、最近は Sign in with AppleSign in with Google あたりを使うと思います。 特にモバイルアプリで Apple か Google で Sign in できれば 100% のユーザーをサポート可能でしょう。

その他のログインサービス:

Azure Active Directory B2C

Azure Activity Directory B2C (以下、AD B2C) は IDaaS です。 複数のログインサービスをまとめて管理できます。

ちなみに、Azure Active Directory は Microsoft Entra ID (以下、Entra) に名称変更しました。 https://news.microsoft.com/ja-jp/2023/07/12/230712-azure-ad-is-becoming-microsoft-entra-id/

Entra には AD B2C の後継に当たる Entra External ID というものがあるようです。

Entra External ID と AD B2C は並行してサポートが続けられます。 2024-01-11 現在、Entra External ID は未だプレビュー なので利用には注意が必要です。

サービスのリリースにまだ時間があり十分にテストできるようなケースでは Entra External ID の利用が推奨されているようです。

新しい顧客の場合、Azure AD B2C または Microsoft Entra 外部 ID (プレビュー) のどちらのソリューションが適していますか?

ただ、Entra 外部 ID を使った Sign in with AppleSign in with Google の実装のやり方がよく分かりませんでした。

ここでは AD B2C を使った認証の仕組みについて述べます。

料金

調査中

https://azure.microsoft.com/ja-jp/pricing/details/active-directory-external-identities/

  • 月間のアクティブユーザー 5 万人までは無料
  • 以降はユーザーあたり $0.00325 (0.4 から 0.5 円くらい)
  • SMS/電話認証: 1回$0.03
  • Go-Local アドオン費用: 月間アクティブユーザーあたり $0.02 (2.4 から 3 円くらい)

突然出てきた Active Directory External Identities というのが何か分からない。 AD B2C の価格ページに飛ぶと Active Directory External Identities の価格ページに飛ぶので同義と考えて良いのかな?

https://azure.microsoft.com/ja-jp/products/active-directory-external-identities

Entra External ID の価格ページも同じところに飛ぶな🤔

https://learn.microsoft.com/ja-jp/entra/external-id/external-identities-pricing

ゲスト ユーザーに適用される価格レベルは、Microsoft Entra テナントに割り当てられている最も高い価格レベルに基づいて決まります。 詳細については、「Microsoft Entra 外部 ID の価格」を参照してください。

制約

チュートリアル:Azure Active Directory B2C テナントの作成 https://learn.microsoft.com/ja-jp/azure/active-directory-b2c/tutorial-create-tenant

チュートリアルに制約についての記載がありました。

  • サブスクリプションあたり最大 20 個のテナントを作成できる
  • 各テナントは合計 125 万ユーザーまで
  • カスタムドメインで利用する場合は 525 万ユーザーまで
  • それ以上は マイクロソフトサポート に連絡
  • 利用状況は テナント使用量 を見る

Web アプリやモバイルアプリはバズるとお試しユーザーが一気に増えることがあると思うので、125 万ユーザーは意外と少ないかもしれません。

実装方法

2つの実装パターン

AD B2C の認証について調べていると、 Azure Active Directory B2C のテナントを作成する というようなドキュメントを目にします。 マイクロソフトアカウントでのサインインであれば AD B2C テナントを作らなくても、 Azure アカウント作成時に作られたテナント (以下、デフォルトテナント) を使って認証を仕組みを作ることができます。 ただし、2024-01-24 現在、通常のテナントではユーザーフローやカスタムポリシーを作ることができないようなので、 Sign in with AppleSign in with Google を実装したい場合は、AD B2C テナントを作成する必要がありそうです。

Webフロントエンドでの認証、Web アプリケーションでの認証、モバイルアプリケーションでの認証、MAUI アプリケーションでの認証などアプリケーションのタイプによってやることがちょっとずつ異なっていますが、Clinet ID が必要になるという点では同じです。

Client ID を発行するためには AD B2C のページに移動し、AD B2C アプリケーションの登録を行います。 この時、アプリケーションのタイプを選択するので、必要なアプリケーションのタイプを選択します。 アプリケーションタイプ毎に AD B2C アプリケーションを登録する必要はなく、最初に選択した AD B2C アプリケーションをベースに Web アプリケーションやモバイルアプリケーションの設定を追加できます。

ユーザーフローを使った認証

デフォルトテナントと B2C テナントでは AD B2C の設定画面が以下のように異なります。

左:デフォルトテナント、右:B2Cテナント

デフォルトテナントではユーザーフローの設定や ID プロバイダーの設定がありません。

Sign in with AppleSign in with Google を有効にするには以下のような流れになります。

  1. Azure で B2C テナントを作成する
  2. Azure でユーザーフローを作成する
  3. Apple Developer でキーを作成する
  4. Google Cloud でキーを作成する
  5. Azure でユーザーフローに 3, 4 で作成したキーを設定する

それぞれのキーの作成方法は Azure のドキュメントにまとまっています。

Azure Active Directory B2C を使って、Apple ID でのサインアップとサインインを設定する https://learn.microsoft.com/ja-jp/azure/active-directory-b2c/identity-provider-apple-id?pivots=b2c-user-flow

Azure Active Directory B2C を使用して Google アカウントでのサインアップおよびサインインを設定する https://learn.microsoft.com/ja-jp/azure/active-directory-b2c/identity-provider-google?pivots=b2c-user-flow

ユーザーフローは各種クライアントで Client ID のほかにユーザーフローIDを指定すれば認証できるようになります。

JavaScript クライアントサンプル

AD B2C を使った認証では Microsoft の MSAL.js を使うことができます。 MSAL の設定に AD B2C アプリケーションの登録時に発行された Client ID を設定します。 あとは msalPublicClientApplication オブジェクトを作成し、 loginPopup() メソッドを呼ぶだけでライブラリが認証の処理を行ってくれます。

とてもシンプルなサンプルを作成しました https://github.com/dictav/examples/tree/master/js-adb2c

また、クイックスタート には SPA アプリケーションのログインサンプルが提示されており、Node.js を使ったアプリケーションのサンプルを動かすことができます。

その他様々な AD B2C のサンプルが公開されています。 https://github.com/orgs/Azure-Samples/repositories?language=&q=b2c&sort=&type=all

ID Token の検証

Azure AD B2C > 概念 > 認証プロトコル > トークン#検証 https://learn.microsoft.com/ja-jp/azure/active-directory-b2c/tokens-overview#validation

SPA アプリケーションやモバイルアプリケーションのクライアントでは サービスサーバーと通信せずに ID Token を取得するため、 サービスサーバー側ではクライアントから送られてきたトークンを信用して良いか分かりません。

OpenID Connect の仕様の通り、 ID Token に含まれる iss を使って {iss}/.well-known/openid-configuration のような URL で OpenID Provider Configuration を取得できます。

例) iss=https://login.example.com
https://login.example.com/.well-known/openid-configuration

AD B2C が返す iss 値はデフォルトでは https://{tenant}.b2clogin.com/{tenant_uuid}/v2.0/ のような値になります。 これより OpenID Provider Configuration の値は https://{tenant}.b2clogin.com/{tenant_uuid}/v2.0/.well-known/openid-configuration になりますが、 ユーザーフローやカスタムポリシーを使っているような場合はこの URL は 404 を返します (使っていない場合の検証できていません 🙏)。

ユーザーフローのID (以下、policy) を使って以下のような URL を作成する必要があります。 policy は ID Token に tfp フィールドに値が入っています。

https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/v2.0/.well-known/openid-configuration

これで得られる OpenID Provider Metadata より、 jwks_uri の値にアクセスすると JWS Set が得られるので、これを使ってユーザーから送られてきた ID Token を検証します。

検証を行う Go 言語サンプルを作りました https://github.com/dictav/examples/tree/master/go-adb2c

まとめ

Azure AD B2C を使って Sign in with AppleSign in with Google の実装した内容をまとめました。

Azure AD B2C を使うと認証周りが楽になるのかというとそういうこともないと思います。 Apple と Google の2つくらいであれば個別に実装するのもそんなに労力の違いはないと思います。 Azure AD B2C の知識が余計に必要になるので、技術選択時にはよく注意するべきです。 Apple と Google だけであれば、Google Cloud Identity Platform も検討するべきでしょう。 Microsoft の認証も必要な場合は Azure AD B2C を使うことに利点と思います。 今回は .NET MAUI を前提としてあるので、連携のしやいだろうということで AD B2C を選択しました。

AD B2C を使うことでユーザー管理が楽になるのかというと、今のところ恩恵は受けてないです。 まだまだ知らない機能が多いので、すごく便利な機能があるかも知れません。