これまでも Azure AD B2C ではカスタムポリシーと外部 API を用意すれば、Microsoft Authenticator や Authy などの TOTP に対応したアプリケーションを使った多要素認証が使えていましたが、標準で TOTP に対応したので試しました。ちなみにプレビューです。
カスタムポリシーと外部 API を使った方法はオルターブースさんのブログで紹介されています。
サンプルコードは一通り GitHub で提供されているのですが、やっぱりそれなりに手間がかかってしまうので標準で使えた方が圧倒的に便利です。なので今後は SMS やメールを使った方法より TOTP が Azure AD B2C での標準になるのではないかと思っています。
プレビュー公開なのでローカライズ周りが未整備という感がありますが、特に問題なく試せました。
ユーザーフローから利用する
ぶっちゃけ Azure Portal から試した方が早いのですが、TOTP 向けにドキュメントも更新されています。
サンプルで提供されていた TOTP はカスタムポリシー必須でしたが、標準で対応したのでユーザーフローでも MFA の手段として TOTP が選べるようになっています。MFA enforcement を Always on にしておくと、常に MFA が要求されるようになるのでテストには最適です。
TOTP の方が SMS やメールよりもセキュリティを高めることが出来るのと、SMS のように追加費用が発生しないのが良いです。最近だと MFA 向けにスマホには Authenticator App が何かしら入っていることが多いと思うので、そういう意味でも抵抗は少なそうです。
この状態でログインフローを進めると、よく見る QR コードをスキャンする画面が表示されます。スマホの Authenticator App で QR コードを読み取ればセットアップ完了です。
Authenticator App を持っていない人向けにアプリのダウンロードリンクも表示されますが、ダウンロードされるのは Microsoft Authenticator となります。カスタムポリシーを使えばこの辺りのカスタマイズは出来そうな感じですが、ローカライズに必要な ID などが公開されていないので試していません。
自分は TOTP 向けに Authy を使っているので以下のようになりました。ちゃんと OTP が表示されています。
一度デバイスを登録してしまえば、次回からのログインフローでは OTP を入力する画面が表示されるようになります。若干味気ない画面にはなりますが、動作自体は問題ありません。
ここで Authenticator App が生成した 6 桁の OTP を入力すればログインが完了します。
登録情報は User の中にある Authentication methods から確認できます。この中に Software OATH token というのが見つかれば、それが登録された MFA 情報になります。
削除すれば当然ながら MFA 情報がリセットされるので、再セットアップが必要になります。ユーザーが自ら MFA 情報をリセットする方法は用意されていないので、対応フローを考慮しておく必要はありそうです。
カスタムポリシー (IEF) から利用する
組み込みの TOTP はカスタムポリシーからも利用できます。サンプルは GitHub で公開されているので、これを利用するとカスタマイズが可能です。以前の TOTP サンプルからの移行用ポリシーも含まれています。
こちらも一応ドキュメントは追記されているのですが、TOTP のカスタムポリシーに関することはほぼ無いので、基本的には GitHub にあるサンプルを見てもらうのが一番良いはずです。
唯一 DisplayControl に関しては TOTP に関するドキュメントが整備されています。ドキュメントにもあるように登録用の QR コード表示を行う画面は 3 分割されたコントロールの集合体になっているので、カスタマイズが柔軟に行えそうです。
ただしローカライズに必要な情報は何処にも公開されていないようなので、暫くは英語のみでの対応になってしまいそうです。Azure Portal から言語リソースをダウンロードしてみましたが、SMS を使うもの用でした。
実際に試してカスタマイズを行っておきたいのは、TOTP の URI に含まれるラベルや発行者の情報かなと思います。デフォルトだと Azure AD B2C の URL が含まれる長ったらしい名前になってしまうので、サービス名など分かりやすいものにしておきたいです。
登録した MFA 情報を Graph API で削除する
TOTP を有効化した後にデバイスを失って OTP が入力できなくなった場合に、何らかの方法でリセットをサービス管理者側で行う必要が出てきますが、Azure Portal からリセットするのはリスキーなので Graph API を使ってリセットを行えるようにしておくのが運用上良さそうです。
Graph API を使うと Authentication methods を削除できるので、これを使うと簡単に実装出来ます。
とはいえやはり Microsoft Account や Azure AD のように MFA 情報を複数登録しておいて、それを使ってユーザー自身がリセットできるようにしておきたいです。ユーザーフローでは無理ですが、カスタムポリシーなら実装出来そうな気はします。