使用 Azure AD B2C 在示例 Android 应用中配置身份验证

本文使用一个示例 Android 应用程序(Kotlin 和 Java),说明如何向移动应用添加 Azure Active Directory B2C (Azure AD B2C) 身份验证。

概述

OpenID Connect (OIDC) 是在 OAuth 2.0 上构建的身份验证协议。 可以使用 OIDC 安全地将用户登录到应用程序。 此移动应用示例将 Microsoft 身份验证库 (MSAL) 用于 OIDC 授权代码 PKCE 流。 MSAL 是 Microsoft 提供的库,可简化向移动应用添加身份验证和授权支持的过程。

登录流涉及以下步骤:

  1. 用户打开应用并选择“登录”。
  2. 应用打开移动设备的系统浏览器,并启动发送至 Azure AD B2C 的身份验证请求。
  3. 用户注册或登录重置密码,或使用社交帐户登录。
  4. 用户成功登录后,Azure AD B2C 向应用返回授权代码。
  5. 应用执行以下操作:
    1. 将此授权代码交换到 ID 令牌、访问令牌和刷新令牌。
    2. 它读取 ID 令牌声明。
    3. 将令牌存储到内存中缓存供以后使用。

应用注册概述

若要让应用能够使用 Azure AD B2C 登录并调用 Web API,需要在 Azure AD B2C 目录中注册两个应用程序。

  • 移动应用注册能你的应用能够使用 Azure AD B2C 登录。 在应用注册期间,指定“重定向 URI”。 重定向 URI 是用户通过 Azure AD B2C 完成身份验证之后 Azure AD B2C 将用户重定向到的终结点。 应用注册过程会生成一个应用程序 ID(也称为客户端 ID),用于唯一标识你的移动应用(例如,应用 ID:1)。

  • 注册 Web API 后,你的应用就能够调用受保护的 Web API。 注册将公开 Web API 权限(范围)。 应用注册过程会生成一个应用程序 ID,用于唯一标识你的 Web API(例如,应用 ID:2)。 向移动应用(应用 ID:1)授予对 Web API 范围(应用 ID:2)的权限。

下图演示了应用注册和应用程序体系结构:

Diagram of the mobile app with web API call registrations and tokens.

调用 Web API

身份验证完成后,用户将与应用交互,应用会调用受保护的 Web API。 Web API 使用持有者令牌身份验证。 持有者令牌是应用从 Azure AD B2C 获取的访问令牌。 应用在 HTTPS 请求的授权标头中传递令牌。

Authorization: Bearer <access token>

如果访问令牌范围与 Web API 范围不一致,身份验证库将获取具有正确范围的新访问令牌。

注销流

注销流程涉及以下步骤:

  1. 用户从应用中注销。
  2. 应用清除其会话对象,并且身份验证库清除其令牌缓存。
  3. 应用将用户定向到 Azure AD B2C 注销终结点,以终止 Azure AD B2C 会话。
  4. 用户被重定向回应用。

先决条件

运行以下内容的计算机:

步骤 1:配置用户流

当用户尝试登录你的应用时,该应用会通过用户流向授权终结点发起身份验证请求。 用户流定义并控制用户体验。 用户完成用户流后,Azure AD B2C 会生成一个令牌,然后将用户重定向回应用程序。

创建用户流或自定义策略(如果你尚未这样做)。 重复这些步骤以按如下所述创建三个单独的用户流:

  • 组合的“登录和注册”用户流,例如 susi。 此用户流还支持“忘记密码”体验。
  • “个人资料编辑”用户流,例如 edit_profile
  • “密码重置”用户流,例如 reset_password

Azure AD B2C 将在用户流名称前面追加 B2C_1_。 例如,susi 重命名为 B2C_1_susi

步骤 2:注册移动应用程序

创建移动应用和 Web API 应用程序注册,并指定 Web API 的作用域。

步骤 2.1:注册 Web API 应用

请按照以下步骤创建 Web API 应用注册(应用 ID: 2):

  1. 登录 Azure 门户

  2. 确保正在使用的目录包含 Azure AD B2C 租户。 在门户工具栏中选择“目录 + 订阅”图标。

  3. 在“门户设置 | 目录+订阅”页上的“目录名称”列表中找到你的 Azure AD B2C 目录,然后选择“切换”。

  4. 在 Azure 门户中,搜索并选择“Azure AD B2C”。

  5. 选择“应用注册”,然后选择“新建注册” 。

  6. 对于名称,请输入应用程序的名称(例如 my-api1) 。 保留“重定向 URI”和“支持的帐户类型”的默认值。

  7. 选择“注册”。

  8. 完成应用注册后,选择“概述”。

  9. 记录“应用程序(客户端) ID”值,以便在稍后配置 Web 应用程序时使用。

    Screenshot that demonstrates how to get a web A P I application I D.

步骤 2.2:配置 Web API 应用的作用域

  1. 选择所创建的 my-api1 应用程序(应用 ID:2)以打开其“概述”页面 。

  2. 在“管理”下,选择“公开 API” 。

  3. 选择“应用程序 ID URI”旁边的“设置”链接。 将默认值 (GUID) 替换为一个唯一名称(例如“tasks-api”),然后选择“保存”。

    Web 应用在请求 Web API 的访问令牌时,应将此 URI 添加为你为 API 定义的每个范围的前缀。

  4. 在“此 API 定义的范围”下选择“添加范围”。

  5. 若要创建一个用于定义对 API 的读取访问权限的范围,请执行以下操作:

    1. 对于“范围名称”,输入“tasks.read” 。
    2. 对于“管理员同意显示名称”,输入“对任务 API 的读取访问权限” 。
    3. 对于“管理员同意说明”,输入“允许对任务 API 进行读取访问” 。
  6. 选择“添加作用域”。

  7. 选择“添加范围”,然后添加一个用于定义对 API 的写入访问权限的范围:

    1. 对于“范围名称”,输入“tasks.write” 。
    2. 对于“管理员同意显示名称”,“对任务 API 的写入访问权限” 。
    3. 对于“管理员同意说明”,输入“允许对任务 API 进行写入访问” 。
  8. 选择“添加作用域”。

步骤 2.3:注册移动应用

若要创建移动应用注册,请执行以下操作:

  1. 登录到 Azure 门户

  2. 选择“应用注册”,然后选择“新建注册” 。

  3. 在“名称”下输入应用程序的名称(例如“android-app1”)。

  4. 在“支持的帐户类型”下,选择“任何标识提供者或组织目录中的帐户(用于通过用户流对用户进行身份验证)” 。

  5. 在“重定向 URI”下选择“公共客户端/本机(移动和桌面)”,然后在 URL 框中输入下列 URI 之一:

    • 对于 Kotlin 示例:msauth://com.azuresamples.msalandroidkotlinapp/1wIqXSqBj7w%2Bh11ZifsnqwgyKrY%3D
    • 对于 Java 示例:msauth://com.azuresamples.msalandroidapp/1wIqXSqBj7w%2Bh11ZifsnqwgyKrY%3D
  6. 选择“注册”。

  7. 完成应用注册后,选择“概述”。

  8. 记录“应用程序(客户端) ID”,以便以后配置移动应用程序时使用。

    Screenshot highlighting the Android application ID

步骤 2.4:授予移动应用对 Web API 的权限

若要向应用(应用 ID:1)授予权限,请执行以下步骤:

  1. 选择“应用注册”,然后选择你所创建的应用(应用 ID:1) 。

  2. 在“管理”下选择“API 权限”。

  3. 在“已配置权限”下,选择“添加权限”。

  4. 选择“我的 API”选项卡。

  5. 选择应授予 Web 应用程序访问权限的 API(应用 ID:2)。 例如,输入“my-api1”。

  6. 在“权限”下展开“任务”,然后选择之前定义的范围(例如,tasks.read 和 tasks.write )。

  7. 选择“添加权限”。

  8. 选择“向<租户名称>授予管理员许可”。

  9. 选择 “是”

  10. 选择“刷新”,然后验证两个范围的“状态”下是否均显示“已授予...” 。

  11. 从“配置权限”列表中,选择范围,然后复制范围全名。

    Screenshot of the configured permissions pane, showing that read access permissions are granted.

步骤 3:获取 Android 移动应用示例

执行以下操作之一:

  • 下载以下示例之一:

    将示例 .zip 文件提取到工作文件夹。

  • 从 GitHub 克隆示例 Android 移动应用程序。

    git clone https://github.com/Azure-Samples/ms-identity-android-kotlin
    

步骤 4:配置示例 Web API

此示例获取移动应用可以在相关作用域内用于 Web API 的访问令牌。 若要通过代码调用 Web API,请执行以下操作:

  1. 使用现有 Web API 或新建一个。 有关详细信息,请参阅使用 Azure AD B2C 在自己的 Web API 中启用身份验证
  2. 更改示例代码以调用 Web API

步骤 5:配置示例移动应用

使用 Android Studio 或其他代码编辑器打开示例项目,然后打开 /app/src/main/res/raw/auth_config_b2c.json 文件。

auth_config_b2c.json 配置文件包含有关 Azure AD B2C 标识提供者的信息。 移动应用使用此信息与 Azure AD B2C 建立信任关系、登录和注销用户、获取令牌和验证令牌。

更新以下应用设置属性:

密钥
client_id 步骤 2.3 中的移动应用 ID。
redirect_uri 来自步骤 2.3 的移动应用程序重定向 URI。
authorities 授权是一个 URL,指示 MSAL 可从中请求令牌的目录。 使用以下格式:https://<your-tenant-name>.b2clogin.cn/<your-tenant-name>.partner.onmschina.cn/<your-sign-in-sign-up-policy>。 将 <your-tenant-name> 替换为你的 Azure AD B2C 租户名称。 然后将 <your-sign-in-sign-up-policy> 替换为在步骤 1 中创建的用户流或自定义策略。

打开 B2CConfiguration 类,并更新以下类成员:

密钥
策略 步骤 1 中创建的用户流或自定义策略的列表。
azureAdB2CHostName Azure AD B2C 租户名称的第一部分(例如 https://contoso.b2clogin.cn)。
tenantName Azure AD B2C 租户的完整租户名称(例如 contoso.partner.onmschina.cn)。
范围 步骤 2.4 中创建的 Web API 作用域。

步骤 6:运行并测试移动应用

  1. 生成并运行该项目。

  2. 选择左上角的汉堡图标(也称为折叠菜单图标),如下所示:

    Screenshot highlighting the hamburger, or collapsed menu, icon.

  3. 在左侧窗格中,选择“B2C 模式”。

    Screenshot highlighting the

  4. 选择“运行用户流”。

    Screenshot highlighting the

  5. 使用你的 Azure AD B2C 本地帐户或社交帐户注册或登录。

  6. 身份验证成功后,你将在“B2C 模式”窗格中看到自己的显示名称。

    Screenshot showing a successful authentication, with signed-in user and policy displayed.

后续步骤

了解如何: