从本地 JavaScript 应用对 Azure 资源进行身份验证

在 Azure 外部运行的应用(例如,在本地或第三方数据中心)在访问 Azure 资源时应使用应用程序服务主体向 Azure 进行身份验证。 应用程序服务主体对象是使用 Azure 中的应用注册过程创建的。 创建应用程序服务主体时,将为应用生成客户端 ID 和客户端机密。 将客户端 ID、客户端机密和租户 ID 存储在环境变量中,以便 用于 JavaScript 的 Azure SDK 在运行时使用环境变量对应用进行 Azure 身份验证。

应为运行应用的每个环境(例如测试、阶段、生产)创建不同的应用注册。 这允许为每个服务主体配置特定于环境的资源权限,并确保部署到一个环境的应用不会与属于另一个环境的 Azure 资源通信。

1 - 在 Azure 中注册应用程序

可以使用 Azure 门户或 Azure CLI 向 Azure 注册应用。

登录到 Azure 门户并执行以下步骤。

说明 屏幕快照
在 Azure 门户中:
  1. 在 Azure 门户顶部的搜索栏中输入“应用注册”。
  2. 在搜索栏下方显示的菜单中的“服务”标题下,选择标有“应用注册”的项。
显示如何使用 Azure 门户中的顶部搜索栏查找并导航到“应用注册”页的屏幕截图。
在“应用注册”页上,选择“+ 新建注册”。 显示“新建注册”按钮在“应用注册”页中的位置的屏幕截图。
在“注册应用程序”页上,按如下所示填写窗体。
  1. 名称 → 输入该应用注册在 Azure 中的名称。 建议在此名称中包含应用名称和应用注册所针对的环境(测试、生产)。
  2. 支持的帐户类型仅限此组织目录中的帐户
选择“注册”以注册应用并创建应用程序服务主体。
通过为应用命名并将支持的帐户类型指定为仅此组织目录中的帐户来填写“注册”的屏幕截图。
在应用的“应用注册”页上:
  1. 应用程序(客户端)ID → 这是应用在本地开发过程中用于访问 Azure 的应用 ID。 将此值复制到文本编辑器中的临时位置,以便在以后的步骤中使用它。
  2. 目录(租户)ID → 应用在向 Azure 进行身份验证时也需要此值。 将此值复制到文本编辑器中的临时位置,因为在稍后的步骤中也需要用到。
  3. 客户端凭据 → 必须先为应用设置客户端凭据,然后应用才能向 Azure 进行身份验证并使用 Azure 服务。 选择“添加证书或机密”以添加应用的凭据。
完成后应用注册的屏幕截图。此屏幕截图显示了应用程序和租户 ID,这将在以后的步骤中需要。
在“证书和机密”页上,选择“+ 新建客户端密码”。 显示“证书和机密”页上用于创建新客户端机密的链接的位置的屏幕截图。
页面右侧会弹出“添加客户端机密”对话框。 在此对话框中:
  1. 说明 → 输入值“当前”。
  2. 过期时间 → 选择值“24 个月”。
选择“添加”以添加机密。

重要说明:在日历中设置机密过期日期之前发出的提醒。这样,可以在此机密过期之前添加新机密和更新应用,并避免应用中出现服务中断。
显示为应用注册过程创建的应用程序服务主体添加了新客户端机密的页面的屏幕截图。
证书和密钥页显示客户端机密的值。

将此值复制到文本编辑器中的临时位置,因为在以后的步骤中将需要它。

重要提示:此值只显示这一次。退出或刷新此页面后,将无法再次看到此值。 你可以添加另一个客户端机密而不会使这个客户端机密失效,但是你不会再看到这个值。
显示包含生成的客户端机密的页面的屏幕截图。

2 - 将角色分配到应用程序服务主体

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

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

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

选择“查看 + 分配”转到最后一页,然后再次选择“查看 + 分配”完成该过程。
显示已完成的“添加角色分配”页,以及用于完成该过程的“查看 + 分配”按钮的位置的屏幕截图。

3 - 为应用程序配置环境变量

必须为运行 JavaScript 应用的进程设置环境变量 AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_CLIENT_SECRET,以使应用程序服务主体凭据在运行时可供应用使用。 DefaultAzureCredential 对象在这些环境变量中查找服务主体信息。

AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>

4 - 在应用程序中实现 DefaultAzureCredential

若要向 Azure 验证 Azure SDK 客户端对象的身份,应用程序应使用 @azure/identity 包中的 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()
);

当上述代码实例化 DefaultAzureCredential 对象时,DefaultAzureCredential 读取环境变量 AZURE_SUBSCRIPTION_IDAZURE_TENANT_IDAZURE_CLIENT_ID 以及 AZURE_CLIENT_SECRET,以获取连接到 Azure 的应用程序服务主体信息。