ホーム

【Azure AD B2C】カスタムポリシーでメールアドレスログインを行う

導入

本記事では、Azure AD B2Cのカスタムポリシーを使い、メールアドレスアカウント(ローカルアカウント)での認証処理を開発していきます。

手順は公式ドキュメントに準じて行なっていきます。

目次

  1. 事前準備

    1. テナントの作成
    2. サブスクリプションの設定
  2. 各種キーの作成

    1. 署名キーの作成
    2. 暗号化キーの作成
  3. IdentityExperienceFrameworkアプリケーションの登録

    1. APIの公開
  4. ProxyIdentityExperienceFramework アプリケーションの登録

    1. APIのアクセス許可を付与
  5. カスタムポリシーの設定

    1. スターターパックを取得
    2. テナント名を変更
    3. カスタムポリシーにアプリケーションIDを設定
  6. カスタムポリシーのアップロード
  7. カスタムポリシーの実行(サインアップ)
  8. カスタムポリシーの実行(サインイン)

事前準備

テナントの作成

AzureADB2Cのテナントが作成されている必要があります。
テナントの作成方法についてはこちらを参照してください。

サブスクリプションの設定

カスタムポリシーを利用するには何らかのサブスクリプションに紐づいている必要があります。
AzureADB2Cテナントではないディレクトリに移動し、[リソースの追加]から紐付ける設定を行なってください。

Azureポータルの設定

Azureポータル側の設定を行います。

署名キーの作成

はじめにトークンに署名をするためのキーを作成します。
[Identity Experience Framework] -> [ポリシー キー] -> [追加] を選択します。
以下の通り入力し、[作成]を押下します。

  • オプション:生成
  • 名前:TokenSigningKeyContainer
  • キーの種類:RSA
  • キー使用法:署名

以下のようなキーが生成されていればOKです。 ScreenShot 2020-09-17 22.00.57.png

暗号化キーの作成

続いて暗号化キーを作成します。
※最終的に取得するトークンは暗号化されていないので、このキーの使い所がわからないのですが、内部処理で使われているようです。

署名キーと同様の手順で、以下の通り入力し、[作成]を押下します。

  • オプション:生成
  • TokenEncryptionKeyContainer
  • キーの種類:RSA
  • キー使用法:暗号化

以下のようなキーが生成されていればOKです。 ScreenShot 2020-09-17 22.01.05.png

IdentityExperienceFrameworkアプリケーションの登録

ローカルアカウント認証のためのアプリケーションを登録します。

[アプリの登録] -> [新規登録] を選択します。

  • アプリ名:IdentityExperienceFramework
  • サポートされているアカウントの種類:この組織のディレクトリ内のアカウントのみ
  • リダイレクト URI:[Web] を選択し、「https://your-tenant-name.b2clogin.com/your-tenant-name.onmicrosoft.com」と入力。 your-tenant-name は、Azure AD B2C テナント ドメイン名です。
  • アクセス許可:[openid と offline_access アクセス許可に対して管理者の同意を付与します] チェック ボックスをオンにする

上記の通り設定したら [登録] を選択します。
後の手順で使用するため、アプリケーション (クライアント) ID をコピーしておきます。

APIの公開

ローカルアカウントログインには以下のAPIが必要なようです。
IdentityExperienceFrameworkアプリの左側のメニューの [管理] -> [API の公開] を選択します。
[スコープの追加] -> [保存して続行] の順に選択します。既定のアプリケーションID URI をそのまま使用します。
次の値を入力して、ご自身の Azure AD B2C テナントでカスタム ポリシーの実行を許可するスコープを作成します。

  • スコープ名:user_impersonation
  • 管理者の同意の表示名:Access IdentityExperienceFramework
  • 管理者の同意の説明:Allow the application to access IdentityExperienceFramework on behalf of the signed-in user.

ScreenShot 2020-09-16 20.56.13.png

ProxyIdentityExperienceFramework アプリケーションの登録

ローカルアカウント認証のため、もう一つアプリケーションを登録します。

[アプリの登録] -> [新規登録] を選択します。

  • アプリ名:ProxyIdentityExperienceFramework
  • サポートされているアカウントの種類:[この組織のディレクトリ内のアカウントのみ] を選択
  • リダイレクト URI:[パブリック クライアント/ネイティブ (モバイルとデスクトップ)] を選択し、[リダイレクト URI] に「myapp://auth」と入力
  • アクセス許可:[openid と offline_access アクセス許可に対して管理者の同意を付与します] チェック ボックスをオンにする

上記の通り設定したら [登録] を選択します。
後の手順で使用するため、アプリケーション (クライアント) ID をコピーしておきます。

APIのアクセス許可を付与

ProxyIdentityExperienceFrameworkアプリに対して、IdentityExperienceFrameworkアプリが公開しているAPIのアクセス許可を付与します。

左側のメニューの [管理] -> [API のアクセス許可] -> [アクセス許可の追加] を選択します。
[自分の API] タブ -> IdentityExperienceFramework アプリケーション -> [user_impersonation] スコープにチェックを入れる -> [アクセス許可の追加] を選択します。
[<テナント名> に管理者の同意を与えます] を選択します。
[最新の情報に更新] を選択した後、スコープの [状態] に、“… に付与されました” が表示されることを確認します。  

ScreenShot 2020-09-16 20.57.04.png

user_impersonationの状態に緑のチェックマークがつけばOKです。 ScreenShot 2020-09-17 21.57.42.png

カスタムポリシーの設定

続いてカスタムポリシーとなるxmlファイルを設定していきます。

スターターパックを取得

AzureADB2CではGitHubでカスタムポリシースターターパックを提供しています。
zipファイルをダウンロードするか、リポジトリをクローンしてください。

ソースをみるといくつかディレクトリがありますが、LocalAccountsディレクトリ配下のソースを使用していきます。
Visual Studio Code等でLocalAccountsディレクトリを開いてください。

ログインする上で必要となるソースは以下の3ファイルです。  

TrustFrameworkBase.xml

各Claimの定義やIDプロバイダーの基本情報が定義されています。
基本的にこのファイルを修正する必要はありません。

TrustFrameworkExtensions.xml

個人のテナントに依存した項目の設定やUIのカスタム設定、IDプロバイダーを追加する際に更新するファイルです。
TrustFrameworkBase.xmlを継承しています。

SignUpOrSignin.xml

ローカルアカウントでのサインイン・サインアップの処理を定義したファイルです。
TrustFrameworkExtensions.xmlを継承しています。

テナント名を変更

LocalAccountsディレクトリのXMLファイルのテナント名がyourtenant.onmicrosoft.comとなっていますので、{自テナント名}.onmicrosoft.comに変更します。

カスタムポリシーにアプリケーションIDを設定

上記で登録したIdentityExperienceFrameworkとProxyIdentityExperienceFrameworkのアプリケーションIDをカスタムポリシーに設定します。
TrustFrameworkExtensions.xmlの4箇所を以下の通り修正します。

  • ProxyIdentityExperienceFrameworkAppId -> ProxyIdentityExperienceFrameworkのアプリケーションIDに修正
  • IdentityExperienceFrameworkAppId -> IdentityExperienceFrameworkのアプリケーションIDに修正
<ClaimsProvider>
  <DisplayName>Local Account SignIn</DisplayName>
  <TechnicalProfiles>
      <TechnicalProfile Id="login-NonInteractive">
      <Metadata>
        <!-- ①ProxyIdentityExperienceFrameworkAppId -> ProxyIdentityExperienceFrameworkのアプリケーションIDに修正 -->
        <Item Key="client_id">ProxyIdentityExperienceFrameworkAppId</Item>
        <!-- ②IdentityExperienceFrameworkAppId -> IdentityExperienceFrameworkのアプリケーションIDに修正 -->
        <Item Key="IdTokenAudience">IdentityExperienceFrameworkAppId</Item>
      </Metadata>
      <InputClaims>
        <!-- ③ProxyIdentityExperienceFrameworkAppId -> ProxyIdentityExperienceFrameworkのアプリケーションIDに修正 -->
        <InputClaim ClaimTypeReferenceId="client_id" DefaultValue="ProxyIdentityExperienceFrameworkAppId" />
        <!-- ④IdentityExperienceFrameworkAppId -> IdentityExperienceFrameworkのアプリケーションIDに修正 -->
        <InputClaim ClaimTypeReferenceId="resource_id" PartnerClaimType="resource" DefaultValue="IdentityExperienceFrameworkAppId" />
      </InputClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

カスタムポリシーのアップロード

[Identity Experience Framework] -> [カスタム ポリシーのアップロード] を選択します。
次の順序でポリシーファイルをアップロードします。この順序でアップロードしないと継承できないためエラーとなります。

  1. TrustFrameworkBase.xml
  2. TrustFrameworkExtensions.xml
  3. SignUpOrSignin.xml

カスタムポリシーの実行(サインアップ)

[カスタム ポリシー] ページで、B2C_1A_signup_signin を選択します。

[アプリケーションの選択] で、以前に登録した Web アプリケーションを選択、[返信 URL] に https://jwt.ms を選択します。
https://jwt.msが選択肢に表示されなければ、[アプリの登録] -> [以前登録したアプリ名] -> [認証] -> [リダイレクトURI]に設定を追加してください。
ここではsample-express-appというアプリを設定しています。

[今すぐ実行] を押下し、カスタムポリシーを実行します。
ScreenShot 2020-09-17 21.17.57png

初回はアカウントがありませんので、サインアップを押下し、新規作成していきます。
ScreenShot 2020-09-17 21.18.14.png

メールアドレス、パスワード、姓名を入力して、[create]を押下してください。 https://jwt.msの画面が表示されたら成功です。
ScreenShot 2020-09-17 21.18.26.png

クエリ部分に渡されたIDトークンがデコードされ、画面に表示されています。
ScreenShot 2020-09-17 21.31.26.png

画面にIDトークンの内容が表示されない場合は、事前のアプリ作成時にインプリシットフローの設定がされていない可能性があります。
[アプリの登録] -> [以前登録したアプリ名] -> [認証] -> [暗黙の付与]のアクセストークンとIDトークンにチェックを入れてください。

カスタムポリシーの実行(サインイン)

同じ手順で再度カスタムポリシー[B2C1Asignup_signin]を実行します。
先ほど登録したアカウントでログインすると、https://jwt.msの画面が表示されるかと思います。

以上で、カスタムポリシーを利用したローカルアカウントの認証処理の実装は完了です。