Azure AD B2C を使用して Android アプリで認証オプションを構成する

この記事では、Android アプリケーションの Azure Active Directory B2C (Azure AD B2C) 認証エクスペリエンスをカスタマイズおよび拡張する方法について説明します。

開始する前に、次の記事の内容をご確認ください。

カスタム ドメインの使用

カスタム ドメインを使用すると、認証 URL を完全にブランド化できます。 ユーザーの観点からは、認証プロセスの間、ユーザーは Azure AD B2C b2clogin.com ドメイン名にリダイレクトされるのではなく、ドメインにとどまります。

URL 内の "b2c" へのすべての参照を削除するために、認証要求 URL の B2C テナント名 contoso.onmicrosoft.com をテナント ID GUID に置換することもできます。 たとえば、https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/https://account.contosobank.co.uk/<tenant ID GUID>/ に変更できます。

認証 URL でカスタム ドメインとテナント ID を使用するには、カスタム ドメインを有効にする方法に関するページのガイダンスに従ってください。 Microsoft Authentication Library (MSAL) 構成オブジェクトを見つけて、authorities を実際のカスタム ドメイン名とテナント ID を使用するように変更します。

次の Kotlin コードは、変更前の MSAL 構成オブジェクトを示しています。

val parameters = AcquireTokenParameters.Builder()
        .startAuthorizationFromActivity(activity)
        .fromAuthority("https://contoso.b2clogin.com/fabrikamb2c.contoso.com/B2C_1_susi")
        // More settings here
        .build()

b2cApp!!.acquireToken(parameters)

次の Kotlin コードは、変更後の MSAL 構成オブジェクトを示しています。

val parameters = AcquireTokenParameters.Builder()
        .startAuthorizationFromActivity(activity)
        .fromAuthority("https://custom.domain.com/00000000-0000-0000-0000-000000000000/B2C_1_susi")
        // More settings here
        .build()

b2cApp!!.acquireToken(parameters)

サインイン名を事前入力する

サインイン ユーザー体験中に、アプリが特定のユーザーをターゲットにする場合があります。 アプリがユーザーを対象とする場合は、認証要求にユーザーのサインイン名を含む login_hint クエリ パラメーターを指定できます。 Azure AD B2C によってサインイン名が自動的に入力されるので、ユーザーはパスワードを入力するだけで済みます。

サインイン名を事前入力するには、次の手順を実行します。

  1. カスタム ポリシーを使用している場合は、直接サインインの設定に関する記事の説明に従って、必要な入力要求を追加します。
  2. MSAL 構成オブジェクトを見つけて、ログイン ヒントを含む withLoginHint() メソッドを追加します。
val parameters = AcquireTokenParameters.Builder()
    .startAuthorizationFromActivity(activity)
    .withLoginHint("bob@contoso.com") 
    // More settings here
    .build()

b2cApp!!.acquireToken(parameters)

ID プロバイダーを事前に選択する

Facebook、LinkedIn、Google などのソーシャル アカウントを含むようにアプリケーションのサインイン プロセスを構成した場合は、domain_hint パラメーターを指定できます。 このクエリ パラメーターは、サインインに使用する必要があるソーシャル ID プロバイダーに関するヒントを Azure AD B2C に提供します。 たとえば、アプリケーションで domain_hint=facebook.com を指定した場合、サインイン フローで Facebook のサインイン ページに直接移動します。

外部 ID プロバイダーにユーザーをリダイレクトするには、以下を実行します。

  1. 外部 ID プロバイダーのドメイン名を確認します。 詳細については、「サインインをソーシャル プロバイダーにリダイレクトする」を参照してください。
  2. リスト オブジェクトを作成するか既存のものを使用して、追加のクエリ パラメーターを格納します。
  3. 対応するドメイン名を含む domain_hint パラメーターをリストに追加します (例: facebook.com)。
  4. 追加のクエリ パラメーター リストを MSAL 構成オブジェクトの withAuthorizationQueryStringParameters メソッドに渡します。
val extraQueryParameters: MutableList<Pair<String, String>> = ArrayList()
extraQueryParameters.add(Pair("domain_hint", "facebook.com"))

val parameters = AcquireTokenParameters.Builder()
    .startAuthorizationFromActivity(activity)
    .withAuthorizationQueryStringParameters(extraQueryParameters) 
    // More settings here
    .build()

b2cApp!!.acquireToken(parameters)

UI 言語を指定する

Azure AD B2C の言語のカスタマイズを使用すると、ユーザー フローで、顧客のニーズに合わせてさまざまな言語に対応できます。 詳細については、言語のカスタマイズに関する記事を参照してください。

優先する言語を設定するには、次のようにします。

  1. 言語のカスタマイズを構成します
  2. リスト オブジェクトを作成するか既存のものを使用して、追加のクエリ パラメーターを格納します。
  3. 対応する言語コードを含む ui_locales パラメーターをリストに追加します (例: en-us)。
  4. 追加のクエリ パラメーター リストを MSAL 構成オブジェクトの withAuthorizationQueryStringParameters メソッドに渡します。
val extraQueryParameters: MutableList<Map.Entry<String, String>> = ArrayList()

val mapEntry   = object : Map.Entry<String, String> {
      override val key: String = "ui_locales"
      override val value: String = "en-us"
    }   
    
extraQueryParameters.add(mapEntry )

val parameters = AcquireTokenParameters.Builder()
    .startAuthorizationFromActivity(activity)
    .withAuthorizationQueryStringParameters(extraQueryParameters) 
    // More settings here
    .build()

b2cApp!!.acquireToken(parameters)

カスタム クエリ文字列パラメーターを渡す

カスタム ポリシーを利用するとき、カスタム クエリ文字列パラメーターを渡すことができます。 ページ コンテンツを動的に変化させるときにお勧めです。

カスタム クエリ文字列パラメーターを渡すには、次の手順に従います。

  1. ContentDefinitionParameters 要素を構成します。
  2. リスト オブジェクトを作成するか既存のものを使用して、追加のクエリ パラメーターを格納します。
  3. campaignId などのカスタム クエリ文字列パラメーターを追加します。 パラメーター値を設定します (例: germany-promotion )。
  4. 追加のクエリ パラメーター リストを MSAL 構成オブジェクトの withAuthorizationQueryStringParameters メソッドに渡します。
val extraQueryParameters: MutableList<Pair<String, String>> = ArrayList()
extraQueryParameters.add(Pair("campaignId", "germany-promotion"))

val parameters = AcquireTokenParameters.Builder()
    .startAuthorizationFromActivity(activity)
    .withAuthorizationQueryStringParameters(extraQueryParameters) 
    // More settings here
    .build()

b2cApp!!.acquireToken(parameters)

ID トークン ヒントを渡す

証明書利用者アプリケーションからは、OAuth2 認可要求の一部としてインバウンド JSON Web トークン (JWT) を送信できます。 インバウンド トークンは、ユーザーまたは認可要求に関するヒントです。 Azure AD B2C によってトークンが検証された後、クレームが抽出されます。

認証要求に ID トークン ヒントを含めるには、次のようにします。

  1. カスタム ポリシーで、ID トークン ヒントの技術プロファイルを定義します。
  2. コードで、ID トークンを生成または取得してから、そのトークンを変数に設定します (例: idToken)。
  3. リスト オブジェクトを作成するか既存のものを使用して、追加のクエリ パラメーターを格納します。
  4. ID トークンを格納する、対応する変数が含まれる id_token_hint パラメーターを追加します。
  5. 追加のクエリ パラメーター リストを MSAL 構成オブジェクトの withAuthorizationQueryStringParameters メソッドに渡します。
val extraQueryParameters: MutableList<Pair<String, String>> = ArrayList()
extraQueryParameters.add(Pair("id_token_hint", idToken))

val parameters = AcquireTokenParameters.Builder()
    .startAuthorizationFromActivity(activity)
    .withAuthorizationQueryStringParameters(extraQueryParameters) 
    // More settings here
    .build()

b2cApp!!.acquireToken(parameters)

埋め込み Web ビュー エクスペリエンス

対話型の認証には Web ブラウザー が必要です。 既定では、MSAL ライブラリはシステム Web ビューを使用します。 サインイン中に、MSAL ライブラリにより、Azure AD B2C ユーザー インターフェイスを使用した Android システム Web ビューがポップアップ表示されます。

詳細については、「Android で MSAL を使用してクロスアプリ SSO を有効にする」という記事を参照してください。

ユーザーの要件によっては、埋め込み Web ビューを使用することもできます。 埋め込み Web ビューと MSAL のシステム Web ビューには、ビジュアルとシングル サインオンの動作に違いがあります。

システム Web ビュー エクスペリエンスと埋め込み Web ビュー エクスペリエンスの違いを示すスクリーンショット。

重要

プラットフォームの既定値 (通常はシステム ブラウザー) を使用することをお勧めします。 システム ブラウザーは、以前にログインしたことのあるユーザーを記憶するのに適しています。 Google などの一部の ID プロバイダーでは、埋め込みビュー エクスペリエンスがサポートされていません。

この動作を変更するには、app/src/main/res/raw/auth_config_b2c.json ファイルを開きます。 次に、WEBVIEW の値を指定して authorization_user_agent 属性を追加します。 次の例で、ビューの種類を Web ビューから埋め込みビューに変更する方法を示します。

{
  "authorization_user_agent": "WEBVIEW" 
}

次のステップ