使用用于 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 门户中导航到托管应用程序代码的资源。

例如,可以在页面顶部的搜索框中键入资源的名称,然后通过在对话框中选择该资源来导航到该资源。
A screenshot showing how to use the top search bar in the Azure portal to locate and navigate to a resource in Azure.
在资源的页面上,从左侧菜单中选择“标识”菜单项。

所有能够支持托管标识的 Azure 资源都具有“标识”菜单项,只是菜单的布局可能略有不同。
A screenshot showing the location of the Identity menu item in the left-hand menu for an Azure resource.
在“标识”页上
  1. 将“状态”滑块移至“打开”。
  2. 单击“保存” 。
此时会显示一个确认对话框,要求你确认是否要为服务启用托管标识。 请回答“是”,随即会为 Azure 资源启用托管标识。
A screenshot showing how to enable managed identity for an Azure resource on the resource's Identity page.

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

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

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

在对话框中的“资源组”标题下选择资源组名称,导航到该资源组。
A screenshot showing how to use the top search bar in the Azure portal to locate and navigate to a resource group in Azure.
在资源组的页面上,从左侧菜单中选择“访问控制(IAM)”。 A screenshot showing the location of the Access control (I A M ) menu item in the left-hand menu of an Azure resource group.
在“访问控制(IAM)”页上
  1. 选择“角色分配”选项卡。
  2. 从顶部菜单中选择“+ 添加”,然后从出现的下拉菜单中选择“添加角色分配”。
A screenshot showing how to navigate to the role assignments tab and the location of the button used to add role assignments to a resource group.
“添加角色分配”页列出了可为资源组分配的所有角色。
  1. 使用搜索框筛选列表,以便以更容易操作的大小显示内容。 此示例演示如何筛选存储 Blob 角色。
  2. 选择要分配的角色。
    选择“下一步”转到下一屏幕。
A screenshot showing how to filter and select role assignments to be added to the resource group.
在下一个“添加角色分配”页面中,可以指定要将角色分配给哪个用户。
  1. 在“将访问权限分配到”下选择“托管标识”。
  2. 在“成员”下选择“+ 选择成员”
Azure 门户的右侧将打开一个对话框。
A screenshot showing how to select managed identity as the type of user you want to assign the role (permission) on the add role assignments page.
在“选择托管标识”对话框中
  1. 可以使用“托管标识”下拉菜单和“选择”文本框来筛选订阅中的托管标识列表。 此示例选择了“应用服务”,因此只显示与应用服务关联的托管标识。
  2. 为托管应用程序的 Azure 资源选择托管标识。
在对话框底部选择“选择”以继续。
A screenshot showing how to use the select managed identities dialog to filter and select the managed identity to assign the role to.
现在,该托管标识将在“添加角色分配”屏幕上显示为选中状态。

选择“查看 + 分配”转到最后一页,然后再次选择“查看 + 分配”完成该过程。
A screenshot of the final add role assignment screen where a user needs to select the Review + Assign button to finalize the role assignment.

3 - 在应用程序中实现 DefaultAzureCredential

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

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

npm install @azure/identity

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

  1. DefaultAzureCredential@azure/identity模块导入类。
  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 资源验证应用。