如何使用 Azure 标识库向 Azure 资源验证 Azure 托管的 JavaScript 应用
当应用托管在 Azure 中(使用 Azure 应用服务、Azure Functions 或 Azure 容器应用等服务)时,可以使用 托管标识 安全地向 Azure 资源验证应用。
托管标识为应用提供标识,允许它连接到其他 Azure 资源,而无需使用机密(例如连接字符串或密钥)。 在内部,Azure 会识别应用的标识,并知道应用有权访问的资源。 Azure 使用此信息自动获取应用的 Microsoft Entra 令牌,使它能够连接到其他 Azure 资源,而无需管理(创建或轮换)身份验证机密。
托管标识类型
托管标识分为两种类型:
- 系统分配的托管标识 - 单个 Azure 资源
- 用户分配的托管标识 - 多个 Azure 资源
本文介绍为应用启用和使用系统分配的托管标识的步骤。 如果需要使用用户分配的托管标识,请参阅管理用户分配的托管标识一文来了解如何创建用户分配的托管标识。
单个资源的系统分配托管标识
系统分配的托管标识由 Azure 资源提供并直接绑定到。 在 Azure 资源上启用托管标识时,你将获得该资源的系统分配的托管标识。 托管标识与 Azure 资源的生命周期相关联。 当资源被删除时,Azure 会自动为你删除标识。 由于你只需为托管代码的 Azure 资源启用托管标识,因此此标识类型是要使用的最简单托管标识类型。
多个资源的用户分配托管标识
用户分配的托管标识是独立的 Azure 资源。 当解决方案具有多个在多个 Azure 资源上运行的工作负荷时,最常使用此标识类型,这些工作负荷都需要共享相同的标识和相同的权限。 例如,假设解决方案包括多个应用服务和虚拟机实例上运行的应用程序。 应用程序都需要访问同一组 Azure 资源。 跨这些资源创建和使用用户分配的托管标识是最佳设计选择。
1 - 在托管应用中启用系统分配的托管标识
第一步是在托管应用的 Azure 资源上启用托管标识。 例如,如果要使用 Azure 应用服务托管 Express.js 应用程序,则需要为该应用服务 Web 应用启用托管标识。 如果使用 VM 托管应用,则允许 VM 使用托管标识。
可以使用 Azure 门户或 Azure CLI 来启用用于 Azure 资源的托管标识。
2 - 将角色分配到托管标识
接下来,需确定应用需要哪些角色(权限),并为托管标识分配 Azure 中的这些角色。 可以在资源、资源组或订阅范围为托管标识分配角色。 此示例演示如何在资源组范围分配角色,因为大多数应用程序将其所有 Azure 资源分组到单个资源组中。
3 - 在应用程序中实现 DefaultAzureCredential
DefaultAzureCredential 会自动检测到正在使用的托管标识,并使用该托管标识对其他 Azure 资源进行身份验证。 如 用于 JavaScript 身份验证的 Azure 标识库概述 一文中所述,DefaultAzureCredential
支持多种身份验证方法并确定在运行时使用的身份验证方法。 这样,应用就可以在不同的环境中使用不同的身份验证方法,而无需实现特定于环境的代码。
首先,将 @azure/identity 包添加到应用程序中。
npm install @azure/identity
接下来,对于在应用中创建 Azure SDK 客户端对象的任何 JavaScript 代码,需要:
- 从
DefaultAzureCredential
模块中导入@azure/identity
类。 - 创建
DefaultAzureCredential
对象。 - 将
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()
);