しばやん雑記

ASP.NET Core とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure AD B2C の知識が古かったのでキャッチアップし直した

ちゃんと触ったのが 2 年前と古く、ASP.NET Core も 2.0 の時だったので最新の情報でもろもろキャッチアップし直しました。基本的に Azure AD が嫌いなので B2C も Azure AD ベースでなければという気持ちが強いのですが、価格的に競合よりも使いやすいので。

とはいえ 2 年前から比べると全体的に使い勝手と機能が改善されていました。Azure Portal での設定もそれなりに分かりやすくなった気がするので、迷うことはあまりなかったです。

ロケーションに APAC が追加された(らしい)

今朝ツイートが流れてきて気が付きましたが、そういえば昔は日本を選べなかったのでした。

先月に作った B2C では特に何も考えずに日本を選んで作っていたので、APAC に作成されていました。

f:id:shiba-yan:20191008201036p:plain

実体はどこにあるのか良くわからないですが、たぶん日本にはなさそうな気がします。

b2clogin.com の導入

同じオリジンでホストされていたのでカスタマイズに制限がありましたが、b2clogin.com を使うとサブドメインが割り当てられるので、JavaScript を使ったカスタマイズが出来るようです。

ASP.NET Core の場合はプロジェクト作成時に設定しておくと、勝手に b2clogin.com に置き換えてくれました。なので最初から b2clogin.com で表示されます。

f:id:shiba-yan:20191008203847p:plain

実際に JavaScript でのカスタマイズをする場合は User Flow での設定が必要になるっぽいです。

Page Layouts Template が劇的に良くなった

前は B2C を使う場合、デフォルトのテンプレートがしょぼすぎてカスタマイズ必須という感じでしたが、テンプレートを Classic 以外に切り替えるとモダンなデザインで利用できます。

f:id:shiba-yan:20191008210226p:plain

切り替えると、以下のようなモダンなデザインでページが表示されるようになります。メッセージなどは言語カスタマイズを使えば変更できるようでした。

ちなみにロゴは AAD 側のブランディングを使っても変わらなかったです。この辺りは HTML をカスタマイズする必要がありそうです。

f:id:shiba-yan:20191008202452p:plain

デフォルトで選択されている Classic なテンプレートは以下のようなしょぼいやつです。昔の Azure や Office 365 と同じ見た目なので、懐かしさはありますが使い勝手と見た目が悪いです。

f:id:shiba-yan:20191008202550p:plain

新しく作成した場合は最初からモダンなデザインになっていて欲しいですが、そうなってはいません。

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 などに対応してほしいところです。

f:id:shiba-yan:20191008210956p:plain

MFA を有効化すると、ログイン時によく見るコードの送信画面が表示されるようになります。

f:id:shiba-yan:20191008211246p:plain

他にも FIDO2 や Microsoft Authenticator を使った認証方法を利用するための設定がありましたが、有効にして色々と試してみましたが動きませんでした。

f:id:shiba-yan:20191008210851p:plain

FIDO2 / Web Authn の実装は正直自前で行いたくないので、B2C 側で対応してくれると最高です。

メールのカスタマイズ (ブランディング)

メールアドレスの認証時に送信されるメールのカスタマイズは対して出来ないようですが、AAD 側のブランディング設定を使うとロゴや名前ぐらいは差し替え出来るようです。

完全なカスタマイズは予定されているみたいですが、特に進捗はなさそうでした。

planned
How can we improve Azure Active Directory?
  • 893 votes
  • 113 comments

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 が詳しそうなので、適当なタイミングでブログ書いてもらわないといけませんね。