ちゃんと触ったのが 2 年前と古く、ASP.NET Core も 2.0 の時だったので最新の情報でもろもろキャッチアップし直しました。基本的に Azure AD が嫌いなので B2C も Azure AD ベースでなければという気持ちが強いのですが、価格的に競合よりも使いやすいので。
とはいえ 2 年前から比べると全体的に使い勝手と機能が改善されていました。Azure Portal での設定もそれなりに分かりやすくなった気がするので、迷うことはあまりなかったです。
ロケーションに APAC が追加された(らしい)
今朝ツイートが流れてきて気が付きましたが、そういえば昔は日本を選べなかったのでした。
遂にAzure AD B2Cで日本リージョンの選択が出来るようになりました。 #AzureADB2C #AADB2Chttps://t.co/RqpyTp6Zeb
— Naohiro Fujie (@phr_eidentity) 2019年10月7日
先月に作った B2C では特に何も考えずに日本を選んで作っていたので、APAC に作成されていました。
実体はどこにあるのか良くわからないですが、たぶん日本にはなさそうな気がします。
b2clogin.com の導入
同じオリジンでホストされていたのでカスタマイズに制限がありましたが、b2clogin.com
を使うとサブドメインが割り当てられるので、JavaScript を使ったカスタマイズが出来るようです。
ASP.NET Core の場合はプロジェクト作成時に設定しておくと、勝手に b2clogin.com
に置き換えてくれました。なので最初から b2clogin.com
で表示されます。
実際に JavaScript でのカスタマイズをする場合は User Flow での設定が必要になるっぽいです。
Page Layouts Template が劇的に良くなった
前は B2C を使う場合、デフォルトのテンプレートがしょぼすぎてカスタマイズ必須という感じでしたが、テンプレートを Classic 以外に切り替えるとモダンなデザインで利用できます。
切り替えると、以下のようなモダンなデザインでページが表示されるようになります。メッセージなどは言語カスタマイズを使えば変更できるようでした。
ちなみにロゴは AAD 側のブランディングを使っても変わらなかったです。この辺りは HTML をカスタマイズする必要がありそうです。
デフォルトで選択されている Classic なテンプレートは以下のようなしょぼいやつです。昔の Azure や Office 365 と同じ見た目なので、懐かしさはありますが使い勝手と見た目が悪いです。
新しく作成した場合は最初からモダンなデザインになっていて欲しいですが、そうなってはいません。
ASP.NET Core 向けライブラリ (2.1 から導入)
ASP.NET Core 2.0 の時は GitHub にサンプルコードが転がっているだけでしたが、2.1 からは NuGet にパッケージが用意されるようになったので簡単に使えるようになりました。
ただしパッケージ ID の通り UI も含んでいるので、カスタマイズ性は例によってイマイチです。オーバーライドすればよいですが、ASP.NET Core Identity のような面倒さがあります。
ソースは GitHub でもちろん公開されているので、実装をコピーするのが楽です。
デフォルトの実装ではログイン後のリダイレクト先が "/" で固定になっているので、その辺りを元々見ていたページに戻るようにする場合は、以下のようにコントローラーを作っておけばよいです。
[AllowAnonymous] public class AccountController : Controller { public AccountController(IOptionsMonitor<AzureADB2COptions> options) { _options = options; } private readonly IOptionsMonitor<AzureADB2COptions> _options; [HttpGet] public IActionResult SignIn(string returnUrl) { var scheme = AzureADB2CDefaults.AuthenticationScheme; return Challenge( new AuthenticationProperties { RedirectUri = returnUrl }, scheme); } [HttpGet] public async Task<IActionResult> SignOut() { var scheme = AzureADB2CDefaults.AuthenticationScheme; var authenticated = await HttpContext.AuthenticateAsync(scheme); if (!authenticated.Succeeded) { return Challenge(scheme); } var options = _options.Get(scheme); var redirectUrl = Url.Action("SignOutComplete", "Home"); return SignOut( new AuthenticationProperties { RedirectUri = redirectUrl }, options.AllSchemes); } }
特に難しいことはしてないので理解できるはずです。デフォルト実装は使わないほうが良い気がします。
Custom Policy (IEF) が GA
この辺りは難しすぎるので詳しい人に任せたいですが、ドキュメントを色々と読んだのである程度は理解できました。主に XML のせいで理解が難しくなっているように思います。
主なユースケースとしてはバックエンドに Azure Functions などで REST API を用意して、独自の処理を透過的に追加することになるかと思います。
ドキュメントでも基本は User Flow を使えと書いてありますし、Custom Policy (IEF) を使うのは最後の手段とでも考えておけばよさそうです。あの XML はあまり書きたくないです。
REST API の保護は気を使う必要がありますね。ドキュメントではクライアント証明書での認証を使うように書いてありました。Basic 認証は本番向けではないでしょうし、地味に扱いにくいです。
独自 IdP から Azure AD B2C への移行
ユーザーの移行は Graph API を使って行う方法が紹介されていますが、Azure Portal からの Bulk Insert も出来そうでした。個人情報の扱いとしては微妙な感じですが、テストデータを入れるときには使えそうです。
ASP.NET Core Identity からの移行時には、パスワード周りの扱いに注意が必要です。
Core Identity ではパスワードは PBKDF2 と HMAC-SHA256 でハッシュ化されているので、B2C へパスワード付きは移行できないためランダムにパスワードを設定して、初回ログイン時に変更させる必要があります。このあたりの処理は Custom Policy を使えば出来るようです。
MFA / FIDO2
SMS を使った MFA は設定からオンにするだけで使えるようになりました。SMS はセキュリティ面での問題もあるし価格も高いので、将来的には TOTP などに対応してほしいところです。
MFA を有効化すると、ログイン時によく見るコードの送信画面が表示されるようになります。
他にも FIDO2 や Microsoft Authenticator を使った認証方法を利用するための設定がありましたが、有効にして色々と試してみましたが動きませんでした。
FIDO2 / Web Authn の実装は正直自前で行いたくないので、B2C 側で対応してくれると最高です。
メールのカスタマイズ (ブランディング)
メールアドレスの認証時に送信されるメールのカスタマイズは対して出来ないようですが、AAD 側のブランディング設定を使うとロゴや名前ぐらいは差し替え出来るようです。
完全なカスタマイズは予定されているみたいですが、特に進捗はなさそうでした。
Fully customizable verification emails
Currently, Azure AD B2C sends verification codes via emails to end users during sign-up and password reset flows. These emails have limited customization. Add support for full customization of the email body & content.
IEF を使うと多少は近いことが出来るようですが、正直その方法は選びたくないですね。
サンプルコードは非常にありがたいですが、何をやっているのか良くわかりませんでした。何となくぶちぞう RD が詳しそうなので、適当なタイミングでブログ書いてもらわないといけませんね。