在示例 Android (Kotlin) 应用中登录用户并调用受保护的 Web API

本指南演示如何配置示例 Android 移动应用程序以登录用户,以及如何调用 ASP.NET Core Web API。

本文将执行以下任务:

  • 在 Microsoft Entra 管理中心注册应用程序。
  • 添加平台重定向 URL。
  • 启用公共客户端流。
  • 更新 Android 配置代码示例文件,以使用自己的 Microsoft Entra 外部 ID 获取客户租户详细信息。
  • 运行并测试示例 Android 移动应用程序。
  • 调用受保护的 Web API。

先决条件

  • Android Studio

  • 外部租户。 如果还没有,请注册免费试用版

  • 公开至少一个范围(委托权限)和一个应用角色(应用程序权限)(例如 ToDoList.Read)的 API 注册。 按照在示例 Android 移动应用中调用 API 的说明,获取受保护的正常运行的 ASP.NET Core Web API。 请确保完成以下步骤:

    • 注册 Web API 应用程序
    • 配置 API 范围
    • 配置应用角色
    • 配置可选声明
    • 克隆或下载示例 Web API
    • 配置并运行示例 Web API

注册应用程序

若要使应用程序能够让用户通过 Microsoft Entra 登录,必须让 Microsoft Entra 外部 ID 能够感知你创建的应用程序。 应用注册会在应用与 Microsoft Entra 之间建立信任关系。 注册应用程序时,外部 ID 会生成一个称为“应用程序(客户端)ID”的唯一标识符,该值用于在创建身份验证请求时标识应用。

以下步骤演示如何在 Microsoft Entra 管理中心注册应用:

  1. 至少以应用程序开发人员的身份登录到 Microsoft Entra 管理中心

  2. 如果你有权访问多个租户,请使用顶部菜单中的“设置”图标 ,通过“目录 + 订阅”菜单切换到你的外部租户

  3. 浏览到“标识”>“应用程序”>“应用注册”。

  4. 选择“+ 新建注册”。

  5. 在显示的“注册应用程序”页中;

    1. 输入一个向应用用户显示的、有意义的应用程序名称,例如 ciam-client-app
    2. 在“支持的帐户类型”下,选择“仅此组织目录中的帐户” 。
  6. 选择“注册”。

  7. 成功注册后,会显示应用程序的“概述”窗格。 记录要在应用程序源代码中使用的应用程序(客户端)ID

添加平台重定向 URL

若要为应用注册指定应用类型,请执行以下步骤:

  1. 在“管理”下,选择“身份验证”。
  2. 在“平台配置”页上,选择“添加平台”,然后选择“Android”选项。
  3. 输入项目的包名称。 如果下载了示例代码,则该值为 com.azuresamples.msaldelegatedandroidkotlinsampleapp
  4. 在“配置 Android 应用”窗格的“签名哈希”部分中,选择“生成开发签名哈希”。这会针对每个开发环境进行更改。在终端中复制并运行操作系统的 KeyTool 命令。
  5. 生成由 KeyTool 生成的签名哈希
  6. 选择“配置” 。
  7. 从“Android 配置”窗格中复制“MSAL 配置”,并将其保存以用于以后的应用配置。
  8. 选择“完成” 。

启用公共客户端流

若要将应用标识为公共客户端,请执行以下步骤:

  1. 在“管理”下,选择“身份验证”。

  2. 在“高级设置”下,对于“允许公共客户端流”,选择“是”。

  3. 选择“保存”以保存更改。

  1. 从“应用注册”页中,选择创建的应用程序(例如 ciam-client-app)以打开其“概述”页。

  2. 在“管理”下选择“API 权限” 。 在“已配置的权限”列表中,应用程序已被分配 User.Read 权限。 但是,由于该租户是外部租户,因此使用者用户本身不能同意此权限。 作为管理员,你必须代表租户中的所有用户同意此权限:

    1. 选择“为 <租户名称> 授予管理员同意”,然后选择“是”。
    2. 选择“刷新”,然后验证两个范围的“状态”下是否均显示“已为 <租户名称> 授予”。

向 Android 示例应用授予 Web API 权限

注册客户端应用和 Web API,并通过创建范围公开 API 后,可按照以下步骤来配置客户端对 API 的权限:

  1. 从“应用注册”页中,选择创建的应用程序(例如 ciam-client-app)以打开其“概述”页。

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

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

  4. 选择“我的组织使用的 API”选项卡。

  5. 在 API 列表中,选择 API(例如 ciam-ToDoList-api)。

  6. 选择“委托的权限”选项。

  7. 从权限列表中,选择“ToDoList.Read”、“ToDoList.ReadWrite”(必要时使用搜索框)。

  8. 选择“添加权限”按钮。

  9. 此时,你已正确分配了权限。 但是,由于租户是客户的租户,因此使用者用户本身不能同意这些权限。 要解决此问题,作为管理员的你必须代表租户中的所有用户同意这些权限:

    1. 选择“为 <租户名称> 授予管理员同意”,然后选择“是”。

    2. 选择“刷新”,然后验证两个权限的“状态”下是否均显示“已为 <租户名称> 授予”。

  10. 从“配置的权限”列表中,选择“ToDoList.Read”和“ToDoList.ReadWrite”权限(一次选择一个),然后复制权限的完整 URI 供以后使用。 完整权限 URI 看起来类似于 api://{clientId}/{ToDoList.Read}api://{clientId}/{ToDoList.ReadWrite}

克隆示例 Android 移动应用程序

若要获取示例应用程序,可以从 GitHub 克隆它或将其下载为 .zip 文件。

  • 若要克隆示例,请打开命令提示符并导航到要创建项目的位置,然后输入以下命令:

    git clone https://github.com/Azure-Samples/ms-identity-ciam-browser-delegated-android-sample
    

配置示例 Android 移动应用程序

若要启用对 Web API 资源的身份验证和访问,请执行以下步骤,配置该示例:

  1. 在 Android Studio 中,打开克隆的项目。

  2. 打开 /app/src/main/res/raw/auth_config_ciam.json 文件。

  3. 查找占位符:

    • 查找 Enter_the_Application_Id_Here 并将其替换为之前注册的应用的应用程序(客户端)ID。
    • Enter_the_Redirect_Uri_Here 并将其替换为之前在添加平台重定向 URL 时下载的 Microsoft 身份验证库 (MSAL) 配置文件中 redirect_uri 的值。
    • Enter_the_Tenant_Subdomain_Here 并将其替换为目录(租户)子域。 例如,如果租户主域为 contoso.onmicrosoft.com,请使用 contoso。 如果不知道租户子域,请了解如何读取租户详细信息
  4. 打开 /app/src/main/AndroidManifest.xml 文件。

  5. 查找占位符:

    • ENTER_YOUR_SIGNATURE_HASH_HERE 并将其替换为你之前添加平台重定向 URL 时生成的签名哈希。
  6. 打开 /app/src/main/java/com/azuresamples/msaldelegatedandroidkotlinsampleapp/MainActivity.kt 文件。

  7. 查找名为 WEB_API_BASE_URL 的属性,然后将 URL 设置为 Web API。

  8. 查找名为 scopes 的属性并设置向 Android 示例应用授予 Web API 权限中记录的范围。

    private const val scopes = "" // Developers should set the respective scopes of their web API here. For example, private const val scopes = "api://{clientId}/{ToDoList.Read} api://{clientId}/{ToDoList.ReadWrite}"
    

应用已配置好,现已可运行。

运行并测试示例 Android 移动应用程序

若要构建并运行应用,请执行以下步骤:

  1. 在工具栏中,从“运行配置”菜单中选择你的应用。

  2. 在目标设备菜单中,选择要在其中运行应用的设备。

    如果没有配置任何设备,则需要创建 Android 虚拟设备以使用 Android Emulator 或连接物理 Android 设备。

  3. 选择“运行”按钮。

  4. 选择“以交互方式获取令牌”以请求访问令牌。

  5. 选择 API - 执行 GET 以调用以前设置的 ASP.NET Core Web API。 成功调用 Web API 将返回 HTTP 200,而 HTTP 403 表示未经授权的访问。