你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 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 身份验证库 (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<Pair<String, String>> = ArrayList()
extraQueryParameters.add(Pair("ui_locales", "en-us"))

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 视图。

要了解详情,请参阅使用 MSAL 启用 Android 上的跨应用 SSO 一文。

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

Screenshot demonstrating the difference between the system web view experience and the embedded web view experience.

重要

建议使用平台默认值,通常为系统浏览器。 系统浏览器能够更好地记住以前登录的用户。 某些标识提供者(如 Google)不支持嵌入式视图体验。

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

{
  "authorization_user_agent": "WEBVIEW" 
}

后续步骤