教程:使用 VM 上的系统分配的托管标识访问 Azure 资源管理器

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

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

将了解如何执行以下操作:

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

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

提示

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

本教程介绍了如何创建系统分配的标识、将其分配给 Windows 虚拟机 (VM),然后再使用该标识访问 Azure 资源管理器 API。 托管服务标识由 Azure 自动管理。 此标识可用于向支持 Microsoft Entra 身份验证的服务进行身份验证,这样就无需在代码中嵌入凭据了。

将了解如何执行以下操作:

  • 授予 VM 对 Azure 资源管理器的访问权限。
  • 使用 VM 的系统分配的托管标识获取访问令牌以访问资源管理器。
  1. 使用管理员帐户登录 Azure 门户

  2. 导航到“资源组”选项卡。

  3. 选择要向其授予 VM 的托管标识访问权限的“资源组”

  4. 在左侧面板中,选择“访问控制(IAM)”。

  5. 依次选择“+ 添加”和“添加角色分配” 。

  6. 在“角色”选项卡中,选择“读取者”。 使用此角色可以查看所有资源,但不能进行任何更改。

  7. 在“成员”选项卡中,对于“将访问权限分配给”选项,选择“托管标识”,然后选择“+ 选择成员”。

  8. 确保“订阅”下拉列表中列出的订阅正确无误。 对于“资源组”,请选择“所有资源组”

  9. 在“管理标识”下拉列表中选择“虚拟机”。

  10. 对于“选择”,请选择下拉列表中的 VM 并选择“保存”

    屏幕截图显示了向托管标识添加读取者角色。

获取访问令牌

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

若要完成这些步骤,需要使用 SSH 客户端。 如果使用的是 Windows,可以在适用于 Linux 的 Windows 子系统中使用 SSH 客户端。 如果需要有关配置 SSH 客户端密钥的帮助,请参阅如何在 Azure 上将 SSH 密钥与 Windows 配合使用如何创建和使用适用于 Azure 中 Linux VM 的 SSH 公钥和私钥对

  1. 在门户中导航到 Linux VM,然后在“概述”中选择“连接”。
  2. 使用所选的 SSH 客户端连接 到 VM。
  3. 在终端窗口中,使用 curl 向 Azure 资源终结点的本地托管标识发出请求,以获取 Azure 资源管理器的访问令牌。   下面是对访问令牌的 curl 请求。
curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' -H Metadata:true

注意

resource 参数的值必须完全匹配 Microsoft Entra ID 预期的值。 若为资源管理器的资源 ID,必须在 URI 的结尾添加斜线。

响应包括访问 Azure 资源管理器所需的访问令牌。

响应:

{
  "access_token":"eyJ0eXAiOi...",
  "refresh_token":"",
  "expires_in":"3599",
  "expires_on":"1504130527",
  "not_before":"1504126627",
  "resource":"https://management.azure.com",
  "token_type":"Bearer"
}

请使用此访问令牌访问 Azure 资源管理器以实现特定目的,例如读取资源组(你之前向此 VM 授予了对它的访问权限)的详细信息。 将值 <SUBSCRIPTION-ID><RESOURCE-GROUP><ACCESS-TOKEN> 替换为之前创建的值。

注意

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

curl https://management.azure.com/subscriptions/<SUBSCRIPTION-ID>/resourceGroups/<RESOURCE-GROUP>?api-version=2016-09-01 -H "Authorization: Bearer <ACCESS-TOKEN>" 

返回的响应包含具体的资源组信息:

{
"id":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/DevTest",
"name":"DevTest",
"location":"westus",
"properties":
{
  "provisioningState":"Succeeded"
  }
} 

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

提示

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

本教程介绍如何创建系统分配的标识、将其分配给 Linux 虚拟机 (VM),再使用此标识访问 Azure 资源管理器 API。 托管服务标识由 Azure 自动管理。 此标识可用于向支持 Microsoft Entra 身份验证的服务进行身份验证,这样就无需在代码中嵌入凭据了。

你将学习如何执行以下操作:

  • 授予 VM 对 Azure 资源管理器的访问权限。
  • 使用 VM 的系统分配的托管标识获取访问令牌以访问资源管理器。
  1. 使用管理员帐户登录 Azure 门户

  2. 导航到“资源组”选项卡。

  3. 选择要向其授予 VM 的托管标识访问权限的“资源组”

  4. 在左侧面板中,选择“访问控制(IAM)”。

  5. 依次选择“+ 添加”和“添加角色分配” 。

  6. 在“角色”选项卡中,选择“读取者”。 使用此角色可以查看所有资源,但不能进行任何更改。

  7. 在“成员”选项卡中,在“将访问权限分配给”选项中,选择“托管标识”,然后选择“+ 选择成员”。

  8. 确保“订阅”下拉列表中列出的订阅正确无误。 对于“资源组”,请选择“所有资源组”

  9. 在“管理标识”下拉列表中选择“虚拟机”。

  10. 在“选择”选项中,选择下拉列表中的 VM 并选择“保存”

    屏幕截图显示了向托管标识添加读取者角色。

获取访问令牌

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

若要完成这些步骤,需要使用 SSH 客户端。 如果使用的是 Windows,可以在适用于 Linux 的 Windows 子系统中使用 SSH 客户端。 如果需要有关配置 SSH 客户端密钥的帮助,请参阅如何在 Azure 上将 SSH 密钥与 Windows 配合使用如何创建和使用适用于 Azure 中 Linux VM 的 SSH 公钥和私钥对

  1. 在 Azure 门户中导航到你的 Linux VM。
  2. 在“概述”中选择“连接”。
  3. 使用所选的 SSH 客户端连接 到 VM。
  4. 在终端窗口中,使用 curl 向 Azure 资源终结点的本地托管标识发出请求,以获取 Azure 资源管理器的访问令牌。   下面是对访问令牌的 curl 请求。
curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' -H Metadata:true

注意

resource 参数的值必须完全匹配 Microsoft Entra ID 预期的值。 若为资源管理器资源 ID,必须在 URI 的结尾添加斜线。

响应包括访问 Azure 资源管理器所需的访问令牌。

响应:

{
  "access_token":"eyJ0eXAiOi...",
  "refresh_token":"",
  "expires_in":"3599",
  "expires_on":"1504130527",
  "not_before":"1504126627",
  "resource":"https://management.azure.com",
  "token_type":"Bearer"
}

使用此访问令牌访问 Azure 资源管理器。 例如,若要阅读之前向其授予此 VM 访问权限的资源组的详细信息。 将值 <SUBSCRIPTION-ID><RESOURCE-GROUP><ACCESS-TOKEN> 替换为之前创建的值。

注意

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

curl https://management.azure.com/subscriptions/<SUBSCRIPTION-ID>/resourceGroups/<RESOURCE-GROUP>?api-version=2016-09-01 -H "Authorization: Bearer <ACCESS-TOKEN>" 

返回的响应包含具体的资源组信息:

{
"id":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/DevTest",
"name":"DevTest",
"location":"westus",
"properties":
{
  "provisioningState":"Succeeded"
  }
} 

后续步骤

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