使用 Windows VM 系统分配的托管标识访问资源管理器

Azure 资源的托管标识是 Microsoft Entra ID 的一项功能。 支持 Azure 资源的托管标识的每个 Azure 服务都受其自己的时间线限制。 在开始之前,请务必查看资源的托管标识的可用性状态以及已知问题

本教程介绍如何使用启用了系统分配的托管标识的 Windows 虚拟机来访问 Azure 资源管理器 API。 Azure 资源的托管标识由 Azure 自动管理,可用于向支持 Microsoft Entra 身份验证的服务进行身份验证,这样就无需在代码中插入凭据了。 学习如何:

  • 授予 VM 对 Azure 资源管理器中资源组的访问权限
  • 使用 VM 标识获取访问令牌,并使用它调用 Azure 资源管理器

先决条件

启用

启用系统分配的托管标识只需单击一次即可。 可以在创建 VM 的过程中或在现有 VM 的属性中启用它。

Screenshot shows the System assigned tab for a virtual machine where you can turn on the System assigned status.

若要在新 VM 上启用系统分配的托管标识,请执行以下操作:

  1. 登录到 Azure 门户

  2. 创建启用了系统分配标识的虚拟机

授予 VM 对资源管理器中资源组的访问权限

提示

本文中的步骤可能因开始使用的门户而略有不同。

使用 Azure 资源托管标识时,应用程序可以获取访问令牌,以向支持 Microsoft Entra 身份验证的资源进行身份验证。 Azure 资源管理器 API 支持 Microsoft Entra 身份验证。 我们将授予此 VM 的标识对 Azure 资源管理器中资源(在本例中为资源组)的访问权限。 我们将在资源组范围向托管标识分配读取者角色。

  1. 使用管理员帐户登录 Azure 门户
  2. 转到“资源组” 选项卡。
  3. 选择要向其授予 VM 的托管标识访问权限的资源组。
  4. 在左侧面板中,选择“访问控制(IAM)”。
  5. 依次选择“添加”、“添加角色分配”。
  6. 在“角色”选项卡中,选择“读取者”。 使用此角色可以查看所有资源,但不能进行任何更改。
  7. 在“成员”选项卡中,为“将访问权限分配给”选择“托管标识”。 然后选择“+ 选择成员”。
  8. 确保“订阅”下拉列表中列出的订阅正确无误。 对于“资源组” ,请选择“所有资源组” 。
  9. 在“管理标识”下拉列表中选择“虚拟机”。
  10. 最后,在“选择”中,从下拉列表中选择你的 Windows 虚拟机,然后选择“保存”。

使用 VM 的系统分配的托管标识获取访问令牌并使用它来调用 Azure 资源管理器

在此部分需要使用 PowerShell。 如果尚未安装 PowerShell,请从此处下载。

  1. 在门户中,导航到“虚拟机”并转到 Windows 虚拟机,然后选择“概述”中的“连接”。

  2. 输入创建 Windows VM 时添加的用户名和密码。

  3. 现在,已经创建了与虚拟机的远程桌面连接,请在远程会话中打开 PowerShell。

  4. 使用 Invoke-WebRequest cmdlet,向 Azure 资源终结点的本地托管标识发出请求以获取 Azure 资源管理器的访问令牌。

       $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' -Method GET -Headers @{Metadata="true"}
    

    注意

    “resource”参数的值必须完全匹配 Microsoft Entra ID 预期的值。 如果使用 Azure 资源管理器资源 ID,必须在 URI 的结尾添加斜线。

    接下来,提取完整响应,响应以 JavaScript 对象表示法 (JSON) 格式字符串的形式存储在 $response 对象中。

    $content = $response.Content | ConvertFrom-Json
    

    接下来,从响应中提取访问令牌。

    $ArmToken = $content.access_token
    

    最后,使用访问令牌调用 Azure 资源管理器。 在此示例中,我们还使用 Invoke-WebRequest cmdlet 调用 Azure 资源管理器,并将访问令牌包含在授权标头中。

    (Invoke-WebRequest -Uri https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>?api-version=2016-06-01 -Method GET -ContentType "application/json" -Headers @{ Authorization ="Bearer $ArmToken"}).content
    

    注意

    URL 区分大小写。因此,请确保大小写与之前在命名资源组时使用的大小写完全相同,并确保“resourceGroup”使用的是大写“G”。

    以下命令将返回资源组的详细信息:

    {"id":"/subscriptions/98f51385-2edc-4b79-bed9-7718de4cb861/resourceGroups/DevTest","name":"DevTest","location":"westus","properties":{"provisioningState":"Succeeded"}}
    

后续步骤

在本快速入门中,你已学习了如何使用系统分配的标识来访问 Azure 资源管理器 API。 若要详细了解 Azure 资源管理器,请参阅: