はじめに
こんにちは、ACS事業部の髙井です。
会社がAzureを採用している場合、ユーザー管理を伴うアプリを開発するのには、多くのケースで「Azure Active Directory B2C」を使うことになるでしょう。
高機能なIdPなので出来ることがたくさんあるんですが、他のAzureリソースと違ってテナント自体を作るため最初の導入で戸惑いやすいです。
また、AAD B2C特有の問題点もあったりしてわりと初心者殺しなので、私がした苦労を他のメンバーが二度としないようにブログにして供養することにしました。
では、さっそく見ていきましょう!!
1. Azure Portalの検索で出てくる候補がやばい
まずは画像をご覧ください!
(Azure AD B2Cが使いたい状況を想定してAzure Portalで「B2C」と検索)
画像を見ていただければお分かりになるかと思いますが、なにも分からないことが分かります。
(AAD B2Cと思しきエンティティが大量にリストされる)
もはやギャグかよと思いますが、正解は以下です。
名称 | 内容 |
---|---|
B2C テナント |
現在開いているテナント上で作成したB2Cテナントの一覧画面が開く |
Azure AD B2C |
B2Cテナントを開いている状態で選択するとB2Cの管理画面にいける |
Azure Active Directory B2C |
B2Cテナントの新規作成画面にいける |
Managed Azure AD B2C |
Amesto Fortytwo AS という外部サービスプロバイダの提供するリソース(詳細不明) |
ちなみに通常のリソースだと一覧画面で作成もできるんですけど、
B2Cテナントの一覧からは、テナントの新規作成ボタンがないです。初心者殺しすぎる。
ここにたどり着けないような初心者だとそもそもテナントが作れません。
ちなみに公式ドキュメントではAzure Portalトップの「リソースの作成」から作るように書かれてます。
2. たどり着いても簡単に作れない
やっと作成にたどり着いたよと思ったのも束の間……
新規作成がMarketplace経由であるため、通常のリソース作成と違いエラーに関する情報が乏しすぎるという罠があります。
B2Cテナントの作成には以下の条件が必要です。
Azureリソースロールとして、B2Cテナントを作成するリソースグループの「共同作成者」の権限をもつこと
対象サブスクリプションのリソースプロバイダに「Microsoft.AzureActiveDirectory」が登録済みであること
(あるいはAzureリソースロールとしてサブスクリプションの「共同作成者」の権限を持つこと)Azureディレクトリロールとして、「テナント作成者」の権限権限をもつこと
(あるいはEntra IDの 設定で「管理者以外のユーザーによるテナントの作成を制限する」が「しない」になっていること)
リソースロールとディレクトリロールの違いは、B2Cに限らないAzureに共通した権限管理レイヤの話で初心者にとっては難しいポイントです。
B2Cの場合はさらに「管理者以外のユーザーによるテナントの作成を制限する」という特別設定があるので、テナントによって同じ権限を持っていても挙動が違うことになったりして初心者は混乱すること間違いなし!
とはいえ、そのあたりがクリアできない知識のままテナントを管理するというのも、それはそれで危ない気はするので、ある意味フィルタとして機能していると言えなくもありませんね……。
3. リダイレクトURL設定の反映がなぜかメチャクチャ遅い
個人的に一番ハマるのがこれです。
Azure AD B2CをOAuthプロバイダーとして、何かしらのアプリケーションで利用するにあたり、リダイレクトURLのホワイトリストを設定できます。
このホワイトリストが反映されずに壊れたような挙動を示すことが頻繁にあります(画面上ではすぐに登録が完了するが、実態として挙動に反映されない)。
この問題はMicrosoftのフォーラムでも報告されていますが、今のところ解消されていないと思います。
フォーラムを見てみると、投稿したMartinさんの怒りが伝わってきます(笑)
The entire redirect system in B2C is both entirely opaque and entirely broken.
(このB2Cとかいうやつは、まったく意味不明だ!完全にぶっこわれてやがる!)
書き出しからこれです(笑)
It works magically sometimes after an undefined period of time. I have lost hours of my life trying to fix something that should never have been an error.
(ずっとエラーを吐いてたかと思えば、放置してたら勝手に直ってたりしやがる!貴重な人生の時間を何時間も無駄にしたぞ!)
私も例にもれず、このB2CのリダイレクトURIが反映されない(かと思えば数時間待つと反映されている)挙動には何度も苦しんでおります。
公式Docには5分で反映されると書いてある
ちなみに公式Docでは3-5分で反映されると書いてあります。
ちなみにフォーラムでは、社員が回答している投稿も別にあったりします。
それを読むとこんなことが書いてあります。
The delay in updating the redirect URL in your Azure B2C tenant could be due to the time it takes for the changes to propagate throughout the system. This is a normal process and can take up to 45-60 minutes.
(B2Cのシステム全体に設定が伝播するのに時間かかってるのかも。これは普通のことで、45-60分くらいかかるよ。)
If it takes longer than an hour something could be misconfigured, but I wouldn't worry currently. Changing the redirect URL isn't something done too often so it shouldn't be an issue.
(なあに心配はいらないさ!リダイレクトURLなんてめったに変更しないから時間かかっても問題ないだろ?)
なるほど~~~~~~。ならそれを公式ドキュメントに書いておいてほしい。
さらに困ったこと
ちなみに変更が反映されないだけ(エラーで弾かれるだけ)ならいいんですが、「認証前にアプリ側から指定したリダイレクトURLを無視して、既に登録されている他のリダイレクトURLに勝手にリダイレクトする挙動を示す」ときがあります。
これ、まれに起こるんですが、マルチテナントアプリケーションでテナントごとにリダイレクトURL切り替えてたりすると一番困る事象です。
解決策として、テナントごとにリダイレクトURLを決めずに、リダイレクト戻り後に元のテナント別URLに再ルーティングするとかって手はあります(アプリ側で追加の一工夫がいりますが)。
B2CのリダイレクトURLのホワイトリストにはそもそも100だか200くらいの上限数があったりする点もあり、最初からシングルポイントにリダイレクトさせるのが事故が防げていいかもしれませんね。
ちなみに、そのアプリの中で1つ目のリダイレクトURLを設定するときに遅延が発生したケースにはいままで出会ったことはありません。
勝手な想定ですが、なにかしらキャッシュが残るような設計になっているんでしょうね。
まとめ
私がこれまでAzure AD B2Cを使ううえで戸惑ってきたところをまとめました。この記事を糧に、これからB2Cを使う方々はスムーズに構築をしていただければと思います。
- AAD B2Cのテナント作成は「Azure Active Directory B2C」というフルで表記された名称のMarketplaceのやつを選ぶ
- テナント作成の権限は特殊なので、ドキュメントを見ながらよく確認する
- リダイレクトURLを複数設定する際は、エラーに焦らず浸透に時間がかかると思って数時間待ってみる
とはいえ、Azure AD B2Cのように高機能なIdPが、そこそこのユーザー数までほぼ無料で使えるのはありがたい限りですね。
今回は以上です!
私達ACS事業部はAzure・AKSを活用した内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。
また、一緒に働いていただける仲間も募集中です!
切磋琢磨しながらスキルを向上できる、エンジニアには良い環境だと思います。ご興味を持っていただけたら嬉しく思います。
ちなみに、私の所属するApplication Engineeringチームでは、Azure Container Apps上にホストするNext.jsアプリケーションの開発なども行っています!