使用用于 JavaScript 的 Azure SDK 向 Azure 资源验证 Azure 托管的应用

在 Azure 中托管应用(使用Azure App 服务、Azure 虚拟机或Azure 容器实例等服务)时,建议使用托管标识对应用进行身份验证

托管标识为应用提供标识,以便应用连接到其他 Azure 资源,而无需使用机密(例如密钥连接字符串)。 在内部,Azure 知道应用的标识以及应用能够连接到哪些资源。 Azure 使用此信息自动获取应用的 Microsoft Entra 令牌,以允许它连接到其他 Azure 资源,而无需管理(创建或轮换)身份验证机密。

托管标识类型

托管标识分为两种类型:

  • 系统分配的托管标识 - 单个 Azure 资源
  • 用户分配的托管标识 - 多个 Azure 资源

本文介绍为应用启用和使用系统分配的托管标识的步骤。 如果需要使用用户分配的托管标识,请参阅管理用户分配的托管标识一文来了解如何创建用户分配的托管标识。

单个资源的系统分配托管标识

系统分配的托管标识由 Azure 资源提供并直接绑定到。 在 Azure 资源上启用托管标识时,你将获得该资源的系统分配的托管标识。 它与 Azure 资源的生命周期相关联。 当资源被删除时,Azure 会自动为你删除标识。 由于只需为托管代码的 Azure 资源启用托管标识,因此这种类型的托管标识最容易使用。

多个资源的用户分配托管标识

从概念上讲,此标识是独立的 Azure 资源。 当解决方案具有在多个 Azure 资源上运行的多个工作负载,而所有这些工作负载都需要共享相同的标识和相同的权限时,这种方法最常用。 例如,如果解决方案具有在多个App 服务和虚拟机实例上运行的组件,并且它们都需要访问同一组 Azure 资源,则跨这些资源创建和使用用户分配的托管标识会有意义。

1 - 系统分配:在托管应用中启用

第一步是在托管应用的 Azure 资源上启用托管标识。 例如,如果要使用 Azure App 服务 托管 Django 应用程序,则需要为该App 服务 Web 应用启用托管标识。 如果使用虚拟机来托管应用,请允许 VM 使用托管标识。

可以使用 Azure 门户或 Azure CLI 来启用用于 Azure 资源的托管标识。

说明 屏幕快照
在 Azure 门户中导航到托管应用程序代码的资源。

例如,可以在页面顶部的搜索框中键入资源的名称,然后通过在对话框中选择该资源来导航到该资源。
显示如何使用 Azure 门户中的顶部搜索栏来查找和导航到 Azure 中的资源的屏幕截图。
在资源的页面上,从左侧菜单中选择“标识”菜单项。

所有能够支持托管标识的 Azure 资源都具有“标识”菜单项,只是菜单的布局可能略有不同。
显示“标识”菜单项在 Azure 资源左侧菜单中的位置的屏幕截图。
在“标识”页上
  1. 将“状态”滑块移至“打开”。
  2. 选择“保存”。
确认对话框会验证是否要为服务启用托管标识。 回答“是”以为 Azure 资源启用托管标识。
显示如何在资源的“标识”页上为 Azure 资源启用托管标识的屏幕截图。

2 - 将角色分配到托管标识

接下来,需确定应用需要哪些角色(权限),并为托管标识分配 Azure 中的这些角色。 可以在资源、资源组或订阅范围为托管标识分配角色。 此示例演示如何在资源组范围分配角色,因为大多数应用程序将其所有 Azure 资源分组到单个资源组中。

说明 屏幕快照
使用 Azure 门户顶部的搜索框搜索资源组名称,找到应用程序的资源组。

在对话框中的“资源组”标题下选择资源组名称,导航到该资源组。
显示如何使用 Azure 门户中的顶部搜索栏找到并导航到 Azure 中的资源组。
在资源组的页面上,从左侧菜单中选择“访问控制 (IAM)”。 此屏幕截图显示 Azure 资源组左侧菜单中的访问控制 (I A M) 菜单项的位置。
在“访问控制(IAM)”页上
  1. 选择“角色分配”选项卡。
  2. 从顶部菜单中选择“+ 添加”,然后从出现的下拉菜单中选择“添加角色分配”。
显示如何导航到角色分配选项卡,以及用于将角色分配添加到资源组的按钮的位置的屏幕截图。
“添加角色分配”页列出了可为资源组分配的所有角色。
  1. 使用搜索框筛选列表,以便以更容易操作的大小显示内容。 此示例演示如何筛选存储 Blob 角色。
  2. 选择要分配的角色。
    选择“下一步”转到下一屏幕。
显示如何筛选和选择要添加到资源组的角色分配的屏幕截图。
在下一个“添加角色分配”页面中,可以指定要将角色分配给哪个用户。
  1. 在“将访问权限分配到”下选择“托管标识”。
  2. 在“成员”下选择“+ 选择成员”
Azure 门户的右侧会打开一个对话框。
显示如何在“添加角色分配”页上选择托管标识作为要为其分配角色(权限)的用户类型的屏幕截图。
在“选择托管标识”对话框中
  1. 可以使用“托管标识”下拉菜单和“选择”文本框来筛选订阅中的托管标识列表。 此示例选择了“应用程序服务”,因此只显示与应用程序服务关联的托管标识。
  2. 为托管应用程序的 Azure 资源选择托管标识。
在对话框底部选择“选择”以继续。
显示如何使用“选择托管标识”对话框来筛选和选择要为其分配角色的托管标识的屏幕截图。
托管标识在“添加角色分配”屏幕上显示为选中状态。

选择“查看 + 分配”转到最后一页,然后再次选择“查看 + 分配”完成该过程。
最终的“添加角色分配”屏幕的屏幕截图,在此屏幕中,用户需要选择“查看 + 分配”按钮来完成角色分配。

3 - 在应用程序中实现 DefaultAzureCredential

DefaultAzureCredential 类会自动检测正在使用托管标识,并使用托管标识向其他 Azure 资源进行身份验证。 如 Azure SDK for JavaScript 身份验证概述文章中所述DefaultAzureCredential支持多种身份验证方法并确定在运行时使用的身份验证方法。 这样,应用便可以在不同的环境中使用不同的身份验证方法,而无需实现特定于环境的代码。

首先,将 @azure/identity 包添加到应用程序中。

npm install @azure/identity

接下来,对于在应用中创建 Azure SDK 客户端对象的任何 JavaScript 代码,需要:

  1. @azure/identity 模块中导入 DefaultAzureCredential 类。
  2. 创建 DefaultAzureCredential 对象。
  3. DefaultAzureCredential 对象传递给 Azure SDK 客户端对象构造函数。

以下代码片段中显示了此操作的示例。

// connect-with-default-azure-credential.js
import { BlobServiceClient } from '@azure/storage-blob';
import { DefaultAzureCredential } from '@azure/identity';
import 'dotenv/config'

const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
if (!accountName) throw Error('Azure Storage accountName not found');

const blobServiceClient = new BlobServiceClient(
  `https://${accountName}.blob.core.windows.net`,
  new DefaultAzureCredential()
);

在本地开发期间在本地工作站上运行上述代码时,SDK 方法 DefaultAzureCredential()在应用程序服务主体或 VS Code、Azure CLI 或 Azure PowerShell 中查找一组开发人员凭据的环境变量,其中任一凭据都可用于在本地开发期间向 Azure 资源验证应用。 这样,此相同的代码可用于在本地开发期间和部署到 Azure 时向 Azure 资源验证应用。