使用 Azure AD B2C 在 Android 应用中配置身份验证选项

重要

自 2025 年 5 月 1 日起,Azure AD B2C 将不再可供新客户购买。 在我们的常见问题解答中了解详细信息

本文介绍如何为 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身份验证库(MSAL 配置对象,然后使用自定义域名和租户 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)

预先选择标识提供者

如果将应用程序的登录旅程配置为包含社交帐户(如 Facebook、LinkedIn 或 Google),则可以指定 domain_hint 参数。 此查询参数向 Azure AD B2C 提供有关应该用于登录的社交标识提供者的提示。 例如,如果应用程序指定 domain_hint=facebook.com,登录流将直接转到 Facebook 登录页。

若要将用户重定向到外部标识提供者,请执行以下作:

  1. 检查外部标识提供者的域名。 有关详细信息,请参阅将登录重定向到社交服务提供商
  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 令牌提示

信赖方应用程序可以将入站 JSON Web 令牌 (JWT) 作为 OAuth2 授权请求的一部分发送。 入站令牌是有关用户或授权请求的提示。 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 视图。

有关详细信息,请参阅 使用 MSAL 文章在 Android 上启用跨应用 SSO

根据你的要求,可以使用嵌入的 Web 视图。 嵌入式 Web 视图与 MSAL 中的系统 Web 视图之间存在可视和单一登录行为差异。

显示系统 Web 视图体验与嵌入式 Web 视图体验之间的差异的屏幕截图。

重要

建议使用平台默认值(通常是系统浏览器)。 系统浏览器更擅长记住之前登录过的用户。 某些标识提供者(如 Google)不支持嵌入式视图体验。

若要更改此行为,请打开 app/src/main/res/raw/auth_config_b2c.json 文件。 然后添加 authorization_user_agent 具有 WEBVIEW 值的属性。 以下示例演示如何将 Web 视图类型更改为嵌入视图:

{
  "authorization_user_agent": "WEBVIEW" 
}

后续步骤