如何使用 Azure VM 上的 Azure 资源的托管标识进行登录

本文提供了有关使用 Azure 资源服务主体的托管标识登录的 PowerShell 和 CLI 脚本示例,以及有关错误处理等重要主题的指南。

注释

建议使用 Azure Az PowerShell 模块与 Azure 交互。 请参阅安装 Azure PowerShell 以开始使用。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

先决条件

  • 如果不熟悉 Azure 资源功能的托管标识,请参阅此概述。 如果没有 Azure 帐户,请在继续操作前注册免费帐户

如果打算使用本文中的 Azure PowerShell 或 Azure CLI 示例,请确保安装最新版本的 Azure PowerShellAzure CLI

重要

  • 本文中的所有示例脚本假定命令行客户端在启用了 Azure 资源的托管标识的 VM 上运行。 在 Azure 门户中使用 VM 的“连接”功能远程连接到 VM。 有关在 VM 上启用 Azure 资源的托管标识的详细信息,请参阅使用 Azure 门户在 VM 上配置 Azure 资源的托管标识,或有关在不同工具(使用 PowerShell、CLI、模板或 Azure SDK)中执行此操作的文章之一。
  • 为了防止资源访问期间出现错误,必须在适当的范围(VM 或更高级别)至少授予 VM 的托管标识“读取者”访问权限,以允许对 VM 执行 Azure 资源管理器操作。 有关详细信息,请参阅 在 Azure 门户中为 Azure 资源分配托管标识以访问资源

概述

Azure 资源的托管标识提供 一个服务主体对象 ,该对象 是在为 VM 上的 Azure 资源启用托管标识时创建的 。 可以向服务主体授予对 Azure 资源的访问权限,并作为脚本/命令行客户端用于登录和资源访问的标识。 传统上,为了根据自己的标识访问受保护的资源,脚本客户端需要:

  • 注册到 Microsoft Entra ID,并同意将 Microsoft Entra ID 用作机密/Web 客户端应用程序
  • 使用应用的凭据(可能会嵌入在脚本中)以自身的服务主体登录

使用 Azure 资源的托管标识时,脚本客户端不再需要这样做,因为它可以在 Azure 资源服务主体的托管标识下登录。

Azure 命令行接口 (CLI)

以下脚本演示如何:

  1. 通过 VM 的 Azure 资源服务主体托管标识登录 Microsoft Entra ID

  2. 调用 Azure 资源管理器并获取 VM 的服务主体 ID。 CLI 会为您自动管理令牌的获取和使用。 请务必将虚拟机名称 <VM-NAME>替换为 。

    az login --identity
    
    $spID=$(az resource list -n <VM-NAME> --query [*].identity.principalId --out tsv)
    echo The managed identity for Azure resources service principal ID is $spID
    

Azure PowerShell

以下脚本演示如何:

  1. 通过 VM 的 Azure 资源服务主体托管标识登录 Microsoft Entra ID

  2. 调用 Azure 资源管理器 cmdlet 以获取有关 VM 的信息。 PowerShell 负责自动管理令牌的使用。

    Add-AzAccount -identity
    
    # Call Azure Resource Manager to get the service principal ID for the VM's managed identity for Azure resources. 
    $vmInfoPs = Get-AzVM -ResourceGroupName <RESOURCE-GROUP> -Name <VM-NAME>
    $spID = $vmInfoPs.Identity.PrincipalId
    echo "The managed identity for Azure resources service principal ID is $spID"
    

Azure 服务的资源 ID

请参阅 支持 Microsoft Entra 身份验证的 Azure 服务,以获取支持 Microsoft Entra ID 并已与 Azure 资源托管标识一起测试的资源列表及其各自的资源 ID。

有关错误处理的指导

如下所示的响应可能指示未正确配置 Azure 资源的 VM 托管标识:

  • PowerShell: Invoke-WebRequest:无法连接到远程服务器
  • CLI:MSI:无法从 http://localhost:50342/oauth2/token 检索令牌,出现错误 HTTPConnectionPool (主机='localhost',端口=50342)

如果收到其中一个错误,请返回到 Azure 门户 中的 Azure 的虚拟机,然后转到 标识 页,确保 系统分配 设置为“是”。

后续步骤