如何使用 Azure 标识库对 Azure 服务的 JavaScript 应用进行身份验证

当应用程序需要访问 Azure 资源(例如存储、Key Vault 或认知服务)时,应用程序必须向 Azure 进行身份验证。 对于所有应用程序(无论是部署到 Azure、本地部署还是在本地开发人员工作站上进行开发)都是如此。 本文介绍使用适用于 JavaScript 的 Azure SDK 时向 Azure 验证应用的建议方法。

建议的方法是让应用在向 Azure 资源进行身份验证时使用基于令牌的身份验证 ,而不是连接字符串或密钥。 Azure 标识库提供基于令牌的身份验证,并允许应用无缝地向 Azure 资源进行身份验证,无论是在本地开发中、部署到 Azure 还是部署到本地服务器。

应用用于对 Azure 资源进行身份验证的特定类型的基于令牌的身份验证取决于应用正在运行的位置,如下图所示。

环境 认证
本地 当开发人员在本地开发期间运行应用时,该应用可以使用应用服务主体或开发人员的 Azure 凭据进行身份验证。 在本地开发期间,身份验证部分中更详细地讨论了上述每个选项。
天蓝色 在 Azure 上托管应用时 - 应用应使用托管标识向 Azure 资源进行身份验证。 下面的在服务器环境中进行身份验证部分更详细地介绍了此选项。
本地 在本地托管和部署应用时 - 应用应使用应用程序服务主体向 Azure 资源进行身份验证。 下面的在服务器环境中进行身份验证部分更详细地介绍了此选项。

显示应用的建议基于令牌的身份验证策略的示意图,具体取决于应用运行位置。

基于令牌的身份验证的优点

为 Azure 构建应用程序时,强烈建议使用基于令牌的身份验证,而不是使用机密(连接字符串或密钥)。 通过 DefaultAzureCredential 提供基于令牌的身份验证。

基于令牌的身份验证 机密(连接字符串和密钥)
最低特权原则,在 Azure 资源上建立应用所需的特定权限。 连接字符串或密钥授予对 Azure 资源的完整权限。
没有要存储的应用程序机密。 必须在应用设置或环境变量中存储和轮换机密。
Azure 标识库在后台为你管理令牌。 这使得使用基于令牌的身份验证像使用连接字符串一样简单。 机密不受管理。

连接字符串的使用应仅限于不访问生产或敏感数据的初始概念验证应用或开发原型。 否则,在向 Azure 资源进行身份验证时,Azure 标识库中提供的基于令牌的身份验证类应始终首选。

使用以下库:

DefaultAzureCredential

Azure 标识库提供的 DefaultAzureCredential 类允许应用使用不同的身份验证方法,具体取决于它们的运行环境。 此行为允许将应用从本地开发提升到测试环境,而无需更改代码。 为每个环境配置适当的身份验证方法,DefaultAzureCredential 会自动检测和使用该身份验证方法。 应优先使用 DefaultAzureCredential,而不是手动编码条件逻辑或功能标志,以在不同的环境中使用不同的身份验证方法。

有关使用 DefaultAzureCredential 的详细信息,请参阅 在应用程序中使用 DefaultAzureCredential

服务器环境中的身份验证

在服务器环境中托管时,每个应用程序应为每个环境分配唯一 应用程序标识。 在 Azure 中,应用标识由 服务主体表示,这是一种特殊类型的 安全主体,旨在向 Azure 标识和验证应用。 要用于应用的服务主体的类型取决于应用正在运行的位置。

在本地开发期间进行身份验证

在本地开发期间,在开发人员工作站上运行应用程序时,本地环境仍必须向应用使用的任何 Azure 服务进行身份验证。

在应用程序中使用 DefaultAzureCredential

DefaultAzureCredential 是用于对 Microsoft Entra ID 进行身份验证的有序机制序列。 每个身份验证机制都是派生自 TokenCredential 类的类,称为 凭据。 在运行时,DefaultAzureCredential 尝试使用第一个凭据进行身份验证。 如果该凭据无法获取访问令牌,则会尝试序列中的下一个凭据,依此方式,直到成功获取访问令牌。 这样,你的应用可以在不同的环境中使用不同的凭据,而无需编写特定于环境的代码。

若要使用 DefaultAzureCredential,请将 @azure/identity 包添加到应用程序。

npm install @azure/identity

然后,以下 代码示例 演示如何实例化 DefaultAzureCredential 对象并将其与 Azure SDK 服务客户端类一起使用,在本例中是用于访问 Azure Blob 存储的 BlobServiceClient

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()
);

DefaultAzureCredential 会自动检测配置给应用的身份验证机制,并获取将应用认证到 Azure 所需的令牌。 如果应用程序使用多个 SDK 客户端,则同一凭据对象可与每个 SDK 客户端对象一起使用。