在Azure虚拟机(VM)上配置托管标识

Azure资源的托管身份为Azure服务在Microsoft Entra ID中提供自动管理的标识。 可以使用此标识向任何支持Microsoft Entra身份验证的服务进行身份验证,而无需在代码中提供凭据。

有关Azure Policy定义和详细信息的信息,请参阅使用Azure Policy来分配托管标识(预览版)

本文介绍如何使用 Azure 门户为 Azure 虚拟机(VM)启用和禁用系统分配的托管标识和用户分配的托管标识。

必备条件

系统分配的托管标识

本部分介绍如何使用 Azure 门户为 VM 启用和禁用系统分配的托管标识。

在创建 VM 的过程中启用系统分配托管标识

若要在 VM 创建期间在 VM 上启用系统分配的托管标识,你的帐户需要虚拟机贡献者角色分配。 不需要其他 Microsoft Entra 目录角色分配。

创建 Windows 虚拟机Linux 虚拟机时,请选择Management选项卡。

在“标识”部分中,选中“启用系统分配的托管标识”复选框。

屏幕截图显示了在创建 VM 期间如何启用系统分配的托管标识。

在现有 VM 上启用系统分配托管标识

若要在最初未预配系统分配的托管标识的 VM 上启用该托管标识,你的帐户需要虚拟机参与者角色分配。 不需要再进行任何其他Microsoft Entra目录角色分配。

  1. 使用与包含 VM 的Azure订阅关联的帐户登录到 Azure 门户

  2. 导航到所需的虚拟机,然后在“安全性”部分中选择“标识”。

  3. 在“系统分配”、“状态”下,选择“开启”,然后单击“保存”

    显示身份页面的屏幕截图,其中系统分配状态设置为启用。

从 VM 中移除系统分配的托管身份标识

若要从 VM 中删除系统分配的托管标识,你的帐户需要虚拟机参与者角色分配。 不需要其他Microsoft Entra目录角色分配。

如果虚拟机不再需要系统分配托管标识,请执行以下操作:

  1. 使用与包含 VM 的Azure订阅关联的帐户登录到 Azure 门户

  2. 导航到所需的虚拟机,然后在“安全性”部分中选择“标识”。

  3. 在“系统分配”、“状态”下,选择“关闭”,然后单击“保存”

    屏幕截图显示了配置页面。

用户分配的托管标识

在本部分中,你将了解如何使用 Azure 门户在 VM 中添加和删除用户分配的托管标识。

在创建虚拟机期间分配用户指定的身份

若要将用户分配标识分配给 VM,你的帐户需要具有虚拟机参与者托管标识操作员角色分配。 无需其他 Microsoft Entra 目录角色分配。

目前,Azure门户不支持在创建 VM 期间分配用户分配的托管标识。 首先创建 Windows 虚拟机Linux 虚拟机,然后将用户分配的托管标识分配给 VM。

向现有 VM 分配用户分配的托管标识

若要将用户分配标识分配给 VM,你的帐户需要具有虚拟机参与者托管标识操作员角色分配。 不需要其他Microsoft Entra目录角色分配。

  1. 使用与包含 VM 的Azure订阅关联的帐户登录到 Azure 门户

  2. 导航到所需的 VM,并单击“安全性”>“标识”、“用户分配”,然后单击“+添加”。 单击要添加到 VM 的用户分配的标识,然后单击“添加”

  3. 从列表中选择以前创建的用户分配的托管标识

    屏幕截图显示了“身份”页面,其中选中了“用户分配”选项,并且突出显示了“添加”按钮。

从 VM 中删除用户分配托管标识

若要从 VM 中删除用户分配的标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。

使用与包含 VM 的Azure订阅关联的帐户登录到 Azure 门户

导航到所需的 VM,然后选择“安全性”>“标识”、“用户分配”、要删除的用户分配托管标识的名称,然后单击“删除”(在确认窗格中单击“”)。

显示如何从 VM 中删除用户分配的托管标识的屏幕截图。

后续步骤

  • 使用 Azure 门户,给予 Azure VM 的托管标识对另一个 Azure 资源的访问权限。

本文中,您将学习如何使用 Azure CLI 来在 Azure VM 上执行以下 Azure 资源的托管身份操作:

  • 在 Azure VM 上启用和禁用系统分配的托管标识
  • 在 Azure VM 上添加和删除用户分配的托管标识

如果还没有Azure帐户,在继续之前注册试用

必备条件

  • 如果希望在本地运行 CLI 引用命令,install Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行Azure CLI。 有关详细信息,请参阅 如何在 Docker 容器中运行Azure CLI

    • 如果使用本地安装,请使用 az login 命令登录到Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅Azure CLI登录。

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 使用 Azure CLI 的扩展。

    • 运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade

系统分配的托管标识

本部分介绍如何使用 Azure CLI 在Azure VM 上启用和禁用系统分配的托管标识。

在创建 Azure VM 期间启用系统分配的托管标识

若要创建启用了系统分配的托管标识的 Azure 虚拟机,您的帐户需要有 Virtual Machine Contributor 角色分配。 不需要其他 Microsoft Entra 目录角色分配。

  1. 运行 az group create,创建用于容纳和部署 VM 及其相关资源的资源组。 如果已有要改用的资源组,可以跳过这一步:

    az group create --name myResourceGroup --location chinanorth
    
  2. 使用az vm create命令来创建虚拟机。 以下示例根据 参数的请求,使用指定的 --assign-identity--role 创建名为 myVM--scope 且具有系统分配的托管标识的 VM。 --admin-username--admin-password 参数指定用于登录虚拟机的管理用户名和密码帐户。 针对自己的环境相应地更新这些值:

    az vm create --resource-group myResourceGroup --name myVM --image win2016datacenter --generate-ssh-keys --assign-identity --role contributor --scope /Subscriptions/mySubscriptionId/resourceGroups/myResourceGroup --admin-username azureuser --admin-password myPassword12
    

在现有 Azure VM 上启用系统分配的托管标识

若要在 VM 上启用系统分配的托管标识,你的帐户需要虚拟机参与者角色分配。 无需其他 Microsoft Entra 目录角色分配。

  1. 如果在本地控制台中使用Azure CLI,请先使用 az login 登录到Azure。 使用与包含 VM 的Azure订阅关联的帐户。

    az login
    
  2. az vm identity assignidentity assign 命令配合使用,为现有 VM 启用系统分配标识:

    az vm identity assign -g myResourceGroup -n myVm
    

从Azure VM 禁用系统分配的标识

若要在 VM 上禁用系统分配的托管标识,你的帐户需要虚拟机参与者角色分配。 不需要分配其他 Microsoft Entra 目录角色。

如果某个虚拟机不再需要系统分配的标识,但仍需要用户分配的标识,请使用以下命令:

az vm update -n myVM -g myResourceGroup --set identity.type='UserAssigned' 

如果某个虚拟机不再需要系统分配的标识,且没有用户分配的标识,请使用以下命令:

注意事项

none 区分大小写。 它必须为小写。

az vm update -n myVM -g myResourceGroup --set identity.type="none"

用户分配的托管标识

在本部分中,你将了解如何使用Azure CLI从Azure VM 添加和删除用户分配的托管标识。 如果在不同于你的 VM 的 RG 中创建用户分配的托管标识。 您必须使用您的托管标识的 URL 将其分配给 VM。 例如:

--identities "/subscriptions/<SUBID>/resourcegroups/<RESROURCEGROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER_ASSIGNED_ID_NAME>"

在创建 Azure VM 期间分配用户分配的托管标识

若要在 VM 创建期间将用户分配的标识分配给 VM,你的帐户需要虚拟机参与者托管标识操作员角色分配。 不需要其他Microsoft Entra目录角色分配。

  1. 如果已有要使用的资源组,可跳过此步骤。 使用 az group create 创建用于包含和部署用户分配托管标识的资源组。 请务必将 <RESOURCE GROUP><LOCATION> 参数值替换为自己的值。 :

    az group create --name <RESOURCE GROUP> --location <LOCATION>
    
  2. 使用 az identity create 创建用户分配托管标识。 -g 参数指定要创建用户分配托管标识的资源组,-n 参数指定其名称。

    重要

    创建用户分配的托管标识时,只能使用字母数字字符(0-9、a-z、A-Z)和连字符 (-)。 要确保虚拟机或虚拟机规模集的分配能够正常工作,名称限制为 24 个字符。 有关详细信息,请参阅 FAQ 和已知问题

    az identity create -g myResourceGroup -n myUserAssignedIdentity
    

    响应包含所创建的用户分配托管标识的详细信息,与以下示例类似。 下一步会用到分配给用户分配托管标识的资源 ID 值。

    {
        "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
        "clientSecretUrl": "https://control-chinanorth.identity.chinacloudapi.cn/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<myUserAssignedIdentity>/credentials?tid=5678&oid=9012&aid=aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
        "id": "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>",
        "location": "chinanorth",
        "name": "<USER ASSIGNED IDENTITY NAME>",
        "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
        "resourceGroup": "<RESOURCE GROUP>",
        "tags": {},
        "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
        "type": "Microsoft.ManagedIdentity/userAssignedIdentities"    
    }
    
  3. 使用az vm create命令来创建虚拟机。 以下示例根据 --assign-identity 参数的指定,使用指定的 --role--scope 创建与新用户分配的标识关联的 VM。 请务必将 <RESOURCE GROUP><VM NAME><USER NAME><PASSWORD><USER ASSIGNED IDENTITY NAME><ROLE><SUBSCRIPTION> 参数值替换为自己的值。

    az vm create --resource-group <RESOURCE GROUP> --name <VM NAME> --image <SKU linux image>  --admin-username <USER NAME> --admin-password <PASSWORD> --assign-identity <USER ASSIGNED IDENTITY NAME> --role <ROLE> --scope <SUBSCRIPTION> 
    

将用户分配的托管标识分配给现有Azure VM

若要将用户分配标识分配给 VM,你的帐户需要具有虚拟机参与者托管标识操作员角色分配。 不需要其他 Microsoft Entra 目录角色分配。

  1. 使用 az identity create 创建用户分配标识。 -g 参数指定要创建用户分配标识的资源组,-n 参数指定其名称。 请务必将 <RESOURCE GROUP><USER ASSIGNED IDENTITY NAME> 参数值替换为自己的值:

    重要

    目前不支持创建名称中具有特殊字符(即下划线)的用户分配托管标识。 请使用字母数字字符。 请关注后续更新。 有关详细信息,请参阅 FAQ 和已知问题

    az identity create -g <RESOURCE GROUP> -n <USER ASSIGNED IDENTITY NAME>
    

    响应包含所创建的用户分配托管标识的详细信息,与以下示例类似。

    {
      "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "clientSecretUrl": "https://control-chinanorth.identity.chinacloudapi.cn/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>/credentials?tid=5678&oid=9012&aid=aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
      "id": "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>",
      "location": "chinanorth",
      "name": "<USER ASSIGNED IDENTITY NAME>",
      "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
      "resourceGroup": "<RESOURCE GROUP>",
      "tags": {},
      "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"    
    }
    
  2. 使用 az vm identity assign 将用户分配标识分配给 VM。 请务必将 <RESOURCE GROUP><VM NAME> 参数值替换为自己的值。 <USER ASSIGNED IDENTITY NAME> 是在上一步创建的用户分配托管标识的资源 name 属性。 如果你在与你的虚拟机不同的资源组中创建了用户分配的托管标识。 您需要使用托管标识的 URL。

    az vm identity assign -g <RESOURCE GROUP> -n <VM NAME> --identities <USER ASSIGNED IDENTITY>
    

从 Azure VM 中删除用户分配的托管标识

若要从 VM 中删除用户分配的标识,你的帐户需要虚拟机参与者角色分配。

如果这是分配给虚拟机的唯一用户分配托管标识,则 UserAssigned 将从标识类型值中删除。 请务必将 <RESOURCE GROUP><VM NAME> 参数值替换为自己的值。 <USER ASSIGNED IDENTITY> 将为用户分配标识的 name 属性,可通过 az vm identity show 在虚拟机的标识部分中找到:

az vm identity remove -g <RESOURCE GROUP> -n <VM NAME> --identities <USER ASSIGNED IDENTITY>

如果 VM 没有系统分配托管标识,并且你希望从中删除所有用户分配标识,请使用以下命令:

注意事项

none 区分大小写。 它必须为小写。

az vm update -n myVM -g myResourceGroup --set identity.type="none" identity.userAssignedIdentities=null

如果 VM 同时具有系统分配标识和用户分配标识,则可以切换为仅使用系统分配标识,从而删除所有用户分配标识。 请使用以下命令:

az vm update -n myVM -g myResourceGroup --set identity.type='SystemAssigned' identity.userAssignedIdentities=null 

后续步骤

本文中,您将学习如何在Azure虚拟机上使用PowerShell执行与Azure资源托管标识相关的操作。

注意事项

建议使用 Azure Az PowerShell 模块与Azure交互。 请参阅 Install Azure PowerShell 入门。 若要了解如何迁移到 Az PowerShell 模块,请参阅 Migrate Azure PowerShell从 AzureRM 迁移到 Az

必备条件

系统分配的托管标识

在本部分中,我们将介绍如何使用Azure PowerShell启用和禁用系统分配的托管标识。

在创建 Azure VM 期间启用系统分配的托管标识

若要创建启用了系统分配托管身份的 Azure 虚拟机,您的帐户需要具有“虚拟机参与者”角色分配。 不需要其他的 Microsoft Entra 目录角色分配。

  1. 请参阅以下Azure VM 快速入门之一,只完成必要的部分(“登录Azure”、“创建资源组”、“创建网络组”、“创建 VM”)。

    转到“创建 VM”部分时,需要对 New-AzVMConfig cmdlet 语法稍做修改。 务必添加 -IdentityType SystemAssigned 参数,以预配启用了系统分配标识的 VM,例如:

    $vmConfig = New-AzVMConfig -VMName myVM -IdentityType SystemAssigned ...
    

在现有 Azure VM 上启用系统分配的托管标识

若要在最初未预配系统分配的托管标识的 VM 上启用该托管标识,你的帐户需要虚拟机参与者角色分配。 不需要其他任何 Microsoft Entra 目录角色分配项。

  1. 使用 Get-AzVM cmdlet 检索 VM 属性。 然后,若要启用系统分配的托管标识,请在 `Update-AzVM` cmdlet 中使用 `` 参数:

    $vm = Get-AzVM -ResourceGroupName myResourceGroup -Name myVM
    Update-AzVM -ResourceGroupName myResourceGroup -VM $vm -IdentityType SystemAssigned
    

将 VM 系统分配的标识添加到组

在 VM 上启用系统分配的标识后,可以将其添加到组中。 以下过程将 VM 的系统分配的标识添加到组。

  1. 检索并记录 VM 服务主体的 ObjectID(由返回值的 Id 字段指定):

    Get-AzADServicePrincipal -displayname "myVM"
    
  2. 检索并记下组中的 ObjectID(在返回值的 Id 字段中指定):

    Get-AzADGroup -searchstring "myGroup"
    
  3. 将虚拟机的服务主体添加到组中:

    New-MgGroupMember -GroupId "<Id of group>" -DirectoryObjectId "<Id of VM service principal>" 
    

从 Azure VM 禁用系统分配的托管标识

若要在 VM 上禁用系统分配的托管标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。

如果某个虚拟机不再需要系统分配的托管标识,但仍需要用户分配的托管标识,请使用以下 cmdlet:

  1. 使用 Get-AzVM cmdlet 检索 VM 属性并将 -IdentityType 参数设置为 UserAssigned

    $vm = Get-AzVM -ResourceGroupName myResourceGroup -Name myVM
    Update-AzVm -ResourceGroupName myResourceGroup -VM $vm -IdentityType "UserAssigned" -IdentityID "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>..."
    

如果某个虚拟机不再需要系统分配的托管标识,且没有用户分配的托管标识,请使用以下命令:

$vm = Get-AzVM -ResourceGroupName myResourceGroup -Name myVM
Update-AzVm -ResourceGroupName myResourceGroup -VM $vm -IdentityType None

用户分配的托管标识

本部分介绍如何使用Azure PowerShell从 VM 添加和删除用户分配的托管标识。

在创建 VM 的过程中分配用户分配的托管标识

若要将用户分配标识分配给 VM,你的帐户需要具有虚拟机参与者托管标识操作员角色分配。 不需要其他 Microsoft Entra 目录角色的分配。

  1. 请参阅以下Azure VM 快速入门之一,只完成必要的部分(“登录Azure”、“创建资源组”、“创建网络组”、“创建 VM”)。

    转到“创建 VM”部分时,需要对 New-AzVMConfig cmdlet 语法稍做修改。 添加 -IdentityType UserAssigned-IdentityID 参数,为 VM 预配用户分配的标识。 将 <VM NAME><SUBSCRIPTION ID><RESOURCE GROUP><USER ASSIGNED IDENTITY NAME> 替换为自己的值。 例如:

    $vmConfig = New-AzVMConfig -VMName <VM NAME> -IdentityType UserAssigned -IdentityID "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>..."
    

将用户分配的托管标识分配给现有Azure VM

若要将用户分配标识分配给 VM,你的帐户需要具有虚拟机参与者托管标识操作员角色分配。 不需要其他 Microsoft Entra 目录角色分配。

  1. 使用 New-AzUserAssignedIdentity cmdlet 创建用户分配的托管标识。 请记下输出中的 Id,因为下一步需用到此信息。

    重要

    创建用户分配的托管标识时仅支持字母数字、下划线和连字符(0-9 或 a-z 或 A-Z、_ 或 -)字符。 此外,名称的长度应限制为 3 到 128 个字符,这样分配给 VM/VMSS 才能正常工作。 有关详细信息,请参阅 FAQ 和已知问题

    New-AzUserAssignedIdentity -ResourceGroupName <RESOURCEGROUP> -Name <USER ASSIGNED IDENTITY NAME>
    
  2. 使用 Get-AzVM cmdlet 检索 VM 属性。 然后,若要将用户分配的托管标识分配给Azure VM,请使用 -IdentityType cmdlet 上的 -IdentityID 开关。 -IdentityId 参数的值是在上一步中记下的 Id。 将 <VM NAME><SUBSCRIPTION ID><RESOURCE GROUP><USER ASSIGNED IDENTITY NAME> 替换为自己的值。

    警告

    若要保留分配给 VM 的任何以前用户分配的托管标识,请查询 VM 对象的 Identity 属性(例如,$vm.Identity)。 如果返回了任何用户分配的托管标识,请将其添加到以下命令以及要分配给 VM 的新用户分配的托管标识中。

    $vm = Get-AzVM -ResourceGroupName <RESOURCE GROUP> -Name <VM NAME>
    
    # Get the list of existing identity IDs and then append to it
    $identityIds = $vm.Identity.UserAssignedIdentities.Keys
    $uid = "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>"
    $identityIds = $identityIds + $uid 
    
    # Update the VM with added identity IDs
    Update-AzVM -ResourceGroupName <RESOURCE GROUP> -VM $vm -IdentityType UserAssigned -IdentityID $uid 
    

从 Azure VM 中删除用户分配的托管标识

若要从 VM 中删除用户分配的标识,你的帐户需要虚拟机参与者角色分配。

如果 VM 具有多个用户分配的托管标识,则可以使用以下命令删除除最后一个以外的所有标识。 请务必将 <RESOURCE GROUP><VM NAME> 参数值替换为自己的值。 <USER ASSIGNED IDENTITY NAME> 是用户分配的托管标识的名称属性,该属性应保留在 VM 上。 可以使用查询来搜索 VM 对象的 Identity 属性来发现此信息。 例如,$vm.Identity

$vm = Get-AzVm -ResourceGroupName myResourceGroup -Name myVm
Update-AzVm -ResourceGroupName myResourceGroup -VirtualMachine $vm -IdentityType UserAssigned -IdentityID <USER ASSIGNED IDENTITY NAME>

如果 VM 没有系统分配的托管标识,而你希望从中删除所有用户分配的托管标识,请使用以下命令:

$vm = Get-AzVm -ResourceGroupName myResourceGroup -Name myVm
Update-AzVm -ResourceGroupName myResourceGroup -VM $vm -IdentityType None

如果 VM 同时具有系统分配的托管标识和用户分配的托管标识,则可通过切换为仅使用系统分配的托管标识,删除所有用户分配的托管标识。

$vm = Get-AzVm -ResourceGroupName myResourceGroup -Name myVm
Update-AzVm -ResourceGroupName myResourceGroup -VirtualMachine $vm -IdentityType "SystemAssigned"

后续步骤

本文通过使用 Azure Resource Manager 部署模板,学习如何在 Azure VM 上执行以下 Azure 资源的托管身份操作:

必备条件

Azure Resource Manager模板

与Azure门户和脚本一样,Azure Resource Manager模板允许部署由Azure资源组定义的新或修改的资源。 有多种可用于执行模板编辑和部署的方法(包括本地方法和基于门户的方法),包括:

无论选择哪种方法,在初始部署和重新部署期间,模板语法都是相同的。 在新的或现有 VM 上启用系统或用户分配的托管标识所采用的方式是相同的。 此外,默认情况下,Azure Resource Manager 对部署执行增量更新。

系统分配的托管标识

在本部分中,将使用Azure Resource Manager模板启用和禁用系统分配的托管标识。

在创建Azure VM 或现有 VM 期间启用系统分配的托管标识

若要在 VM 上启用系统分配的托管标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。

  1. 无论是在本地登录 Azure 还是通过 Azure 门户进行登录,都应使用与包含虚拟机的 Azure 订阅关联的账户。

  2. 若要启用系统分配的托管标识,请将模板加载到编辑器中,在 Microsoft.Compute/virtualMachines 节中找到所关注的 resources 资源,并在与 "identity" 属性相同的级别添加 "type": "Microsoft.Compute/virtualMachines" 属性。 使用以下语法:

    "identity": {
        "type": "SystemAssigned"
    },
    
  3. 完成工作后,应将以下各段添加到模板的resource段,模板应显示如下内容:

     "resources": [
         {
             //other resource provider properties...
             "apiVersion": "2018-06-01",
             "type": "Microsoft.Compute/virtualMachines",
             "name": "[variables('vmName')]",
             "location": "[resourceGroup().location]",
             "identity": {
                 "type": "SystemAssigned",
                 }                        
         }
     ]
    

向 VM 的系统分配的托管标识分配一个角色

在 VM 上启用系统分配的托管标识后,建议向其授予一个角色,例如对创建它的资源组的“读取者”访问权限。 可以在 使用 Azure Resource Manager 模板分配 Azure 角色 文章中找到帮助完成此步骤的详细信息。

从 Azure VM 禁用系统分配的托管标识

若要从 VM 中删除系统分配的托管标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。

  1. 无论是登录到本地的 Azure 还是通过 Azure 门户登录,都使用与包含 VM 的 Azure 订阅关联的帐户。

  2. 将模板加载到编辑器,并在 Microsoft.Compute/virtualMachines 部分找到相关的 resources 资源。 如果 VM 只有系统分配的托管标识,则可以将标识类型更改为 None 来禁用它。

    Microsoft.Compute/virtualMachines API 版本 2018-06-01

    如果 VM 同时具有系统和用户分配的托管标识,请从标识类型中删除 SystemAssigned 并保留 UserAssigned 以及 userAssignedIdentities 字典值。

    Microsoft.Compute/virtualMachines API 版本 2018-06-01

    如果 apiVersion2017-12-01 并且 VM 同时具有系统和用户分配的托管标识,请从标识类型中删除 SystemAssigned 并保留 UserAssigned 以及用户分配的托管标识的 identityIds 数组。

以下示例演示如何从不包含用户分配托管身份的 VM 中删除系统分配的托管身份:

{
    "apiVersion": "2018-06-01",
    "type": "Microsoft.Compute/virtualMachines",
    "name": "[parameters('vmName')]",
    "location": "[resourceGroup().location]",
    "identity": {
        "type": "None"
    }
}

用户分配的托管标识

在本部分中,将使用Azure Resource Manager模板将用户分配的托管标识分配给Azure VM。

注意事项

若要使用Azure Resource Manager模板创建用户分配的托管标识,请参阅 创建用户分配的托管标识

将用户分配的托管标识分配给Azure VM

若要将用户分配的标识分配给 VM,你的帐户需要托管标识操作员角色分配。 不需要其他 Microsoft Entra 目录角色分配。

  1. resources 元素下添加以下条目,以向 VM 分配用户分配的托管标识。 请务必将 <USERASSIGNEDIDENTITY> 替换为你创建的用户分配托管身份的名称。

    Microsoft.Compute/virtualMachines API 版本 2018-06-01

    如果 apiVersion2018-06-01,则用户分配的托管标识以 userAssignedIdentities 字典格式存储,并且 <USERASSIGNEDIDENTITYNAME> 值必须存储在模板的 variables 节中定义的某个变量中。

     {
         "apiVersion": "2018-06-01",
         "type": "Microsoft.Compute/virtualMachines",
         "name": "[variables('vmName')]",
         "location": "[resourceGroup().location]",
         "identity": {
             "type": "userAssigned",
             "userAssignedIdentities": {
                 "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('<USERASSIGNEDIDENTITYNAME>'))]": {}
             }
         }
     }
    

    Microsoft.Compute/virtualMachines API 版本 2017-12-01

    如果 apiVersion2017-12-01,则用户分配的托管标识存储在 identityIds 数组中,并且 <USERASSIGNEDIDENTITYNAME> 值必须存储在模板的 variables 节中定义的某个变量中。

    {
        "apiVersion": "2017-12-01",
        "type": "Microsoft.Compute/virtualMachines",
        "name": "[variables('vmName')]",
        "location": "[resourceGroup().location]",
        "identity": {
            "type": "userAssigned",
            "identityIds": [
                "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('<USERASSIGNEDIDENTITYNAME>'))]"
            ]
        }
    }
    
  2. 完成工作后,应将以下各段添加到模板的resource段,模板应显示如下内容:

    Microsoft.Compute/virtualMachines API 版本 2018-06-01

      "resources": [
         {
             //other resource provider properties...
             "apiVersion": "2018-06-01",
             "type": "Microsoft.Compute/virtualMachines",
             "name": "[variables('vmName')]",
             "location": "[resourceGroup().location]",
             "identity": {
                 "type": "userAssigned",
                 "userAssignedIdentities": {
                    "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('<USERASSIGNEDIDENTITYNAME>'))]": {}
                 }
             }
         }
     ] 
    

    Microsoft.Compute/virtualMachines API 版本 2017-12-01

    "resources": [
         {
             //other resource provider properties...
             "apiVersion": "2017-12-01",
             "type": "Microsoft.Compute/virtualMachines",
             "name": "[variables('vmName')]",
             "location": "[resourceGroup().location]",
             "identity": {
                 "type": "userAssigned",
                 "identityIds": [
                    "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('<USERASSIGNEDIDENTITYNAME>'))]"
                 ]
             }
         }
    ]
    

从 Azure VM 中删除用户分配的托管标识

若要从 VM 中删除用户分配的标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。

  1. 无论是登录到本地的 Azure 还是通过 Azure 门户登录,都使用与包含 VM 的 Azure 订阅关联的帐户。

  2. 将模板加载到编辑器,并在 Microsoft.Compute/virtualMachines 部分找到相关的 resources 资源。 如果 VM 只有用户分配的托管标识,则可以通过将标识类型更改为 None 来禁用它。

    以下示例演示如何从没有系统分配的托管标识的 VM 中删除所有用户分配的托管标识:

     {
       "apiVersion": "2018-06-01",
       "type": "Microsoft.Compute/virtualMachines",
       "name": "[parameters('vmName')]",
       "location": "[resourceGroup().location]",
       "identity": {
           "type": "None"
           },
     }
    

    Microsoft.Compute/virtualMachines API 版本 2018-06-01

    若要从 VM 中删除单个用户分配的托管标识,请将其从 userAssignedIdentities 字典中删除。

    如果具有系统分配的托管标识,请将其保持在 type 值下的 identity 值中。

    Microsoft.Compute/virtualMachines API 版本 2017-12-01

    若要从 VM 中删除单个用户分配的托管标识,请将其从 identityIds 数组中删除。

    如果具有系统分配的托管标识,请将其保持在 type 值下的 identity 值中。

后续步骤

在本文中,您将了解如何使用 CURL 调用 Azure Resource Manager REST 终结点,在 Azure VM 上对 Azure 资源执行以下托管身份操作:

  • 在 Azure VM 上启用和禁用系统分配的托管标识
  • 在 Azure VM 上添加和删除用户分配的托管标识

如果还没有Azure帐户,在继续之前注册试用

必备条件

  • 如果希望在本地运行 CLI 引用命令,install Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行Azure CLI。 有关详细信息,请参阅 如何在 Docker 容器中运行Azure CLI

    • 如果使用本地安装,请使用 az login 命令登录到Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅Azure CLI登录。

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 使用 Azure CLI 的扩展。

    • 运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade

系统分配的托管标识

本部分介绍如何使用 CURL 在 Azure VM 上启用和禁用系统分配的托管标识,以调用 Azure Resource Manager REST 终结点。

在创建 Azure VM 期间启用系统分配的托管标识

若要创建启用了系统分配托管身份的 Azure 虚拟机,您的帐户需要具有“虚拟机参与者”角色分配。 不需要其他 Microsoft Entra 目录角色分配。

  1. 运行 az group create,创建用于容纳和部署 VM 及其相关资源的资源组。 如果已有要改用的资源组,可以跳过这一步:

    az group create --name myResourceGroup --location chinanorth2
    
  2. 为 VM 创建网络接口

     az network nic create -g myResourceGroup --vnet-name myVnet --subnet mySubnet -n myNic
    
  3. 获取 Bearer 类型的访问令牌,在下一步中,您将在授权标头中使用该令牌来创建具有系统分配托管标识的 VM。

    az account get-access-token
    
  4. 使用 CURL 创建 VM 以调用Azure Resource Manager REST 终结点。 下面的示例创建名为 myVM 且已启用系统分配的托管标识(请求正文中用值 "identity":{"type":"SystemAssigned"} 进行标识)的 VM。 将 <ACCESS TOKEN> 替换为您在上一步请求 Bearer 访问令牌时收到的值,并根据您的环境适当地替换 <SUBSCRIPTION ID> 值。

    curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01' -X PUT -d '{"location":"chinanorth2","name":"myVM","identity":{"type":"SystemAssigned"},"properties":{"hardwareProfile":{"vmSize":"Standard_D2_v2"},"storageProfile":{"imageReference":{"sku":"2016-Datacenter","publisher":"MicrosoftWindowsServer","version":"latest","offer":"WindowsServer"},"osDisk":{"caching":"ReadWrite","managedDisk":{"storageAccountType":"StandardSSD_LRS"},"name":"myVM3osdisk","createOption":"FromImage"},"dataDisks":[{"diskSizeGB":1023,"createOption":"Empty","lun":0},{"diskSizeGB":1023,"createOption":"Empty","lun":1}]},"osProfile":{"adminUsername":"azureuser","computerName":"myVM","adminPassword":"<SECURE PASSWORD STRING>"},"networkProfile":{"networkInterfaces":[{"id":"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNic","properties":{"primary":true}}]}}}' -H "Content-Type: application/json" -H "Authorization: Bearer <ACCESS TOKEN>"
    
    PUT https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    请求正文

      {
        "location":"chinanorth2",
        "name":"myVM",
        "identity":{
           "type":"SystemAssigned"
        },
        "properties":{
           "hardwareProfile":{
              "vmSize":"Standard_D2_v2"
           },
           "storageProfile":{
              "imageReference":{
                 "sku":"2016-Datacenter",
                 "publisher":"MicrosoftWindowsServer",
                 "version":"latest",
                 "offer":"WindowsServer"
              },
              "osDisk":{
                 "caching":"ReadWrite",
                 "managedDisk":{
                    "storageAccountType":"StandardSSD_LRS"
                 },
                 "name":"myVM3osdisk",
                 "createOption":"FromImage"
              },
              "dataDisks":[
                 {
                    "diskSizeGB":1023,
                    "createOption":"Empty",
                    "lun":0
                 },
                 {
                    "diskSizeGB":1023,
                    "createOption":"Empty",
                    "lun":1
                 }
              ]
           },
           "osProfile":{
              "adminUsername":"azureuser",
              "computerName":"myVM",
              "adminPassword":"myPassword12"
           },
           "networkProfile":{
              "networkInterfaces":[
                 {
                    "id":"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNic",
                    "properties":{
                       "primary":true
                    }
                 }
              ]
           }
        }
     }  
    

在现有Azure VM 上启用系统分配的标识

若要在最初未预配系统分配的托管标识的 VM 上启用该托管标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。

  1. 获取 Bearer 类型的访问令牌,在下一步中,您将在授权标头中使用该令牌来创建具有系统分配托管标识的 VM。

    az account get-access-token
    
  2. 使用以下 CURL 命令调用 Azure Resource Manager REST 终结点,在请求正文中通过 {"identity":{"type":"SystemAssigned"} 值为名为 myVM 的 VM 启用系统分配的托管身份。 将 <ACCESS TOKEN> 替换为您在上一步请求 Bearer 访问令牌时收到的值,并根据您的环境适当地替换 <SUBSCRIPTION ID> 值。

    重要

    若要确保不删除用户分配给 VM 的任何现有托管标识,需要使用以下 CURL 命令列出用户分配的托管标识:curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/virtualMachines/<VM NAME>?api-version=2018-06-01' -H "Authorization: Bearer <ACCESS TOKEN>"。 如果具有用户分配给 VM 的任何托管标识(响应中用值 identity 进行标识),请跳过步骤 3,该步骤介绍了如何在 VM 上启用系统分配的托管标识的同时保留用户分配的托管标识。

    curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"SystemAssigned"}}' -H "Content-Type: application/json" -H "Authorization:Bearer <ACCESS TOKEN>"
    
    PATCH https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    请求正文

     {  
        "identity":{  
           "type":"SystemAssigned"
        }
     }
    
  3. 要在具有现有用户分配的托管标识的 VM 上启用系统分配的托管标识,需要将 SystemAssigned 添加到 type 值。

    例如,如果 VM 具有用户分配给它的托管标识 ID1ID2 并且你希望将系统分配的托管标识添加到该 VM,请使用以下 CURL 调用。 将 <ACCESS TOKEN><SUBSCRIPTION ID> 替换为适合环境的值。

    API 版本 2018-06-01 以字典格式将用户分配的托管标识存储在 userAssignedIdentities 值中,而 API 版本 identityIds 则以数组格式将托管标识存储在 2017-12-01 值中。

    API 版本 2018-06-01

    curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"SystemAssigned, UserAssigned", "userAssignedIdentities":{"/subscriptions/<<SUBSCRIPTION ID>>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{},"/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2":{}}}}' -H "Content-Type: application/json" -H "Authorization:Bearer <ACCESS TOKEN>"
    
    PATCH https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    请求正文

     {  
        "identity":{  
           "type":"SystemAssigned, UserAssigned",
           "userAssignedIdentities":{  
              "/subscriptions/<<SUBSCRIPTION ID>>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{  
    
              },
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2":{  
    
              }
           }
        }
     }
    

    API 版本 2017-12-01

    curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01' -X PATCH -d '{"identity":{"type":"SystemAssigned, UserAssigned", "identityIds":["/subscriptions/<<SUBSCRIPTION ID>>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1","/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2"]}}' -H "Content-Type: application/json" -H "Authorization:Bearer <ACCESS TOKEN>"
    
    PATCH https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    请求正文

     {  
        "identity":{  
           "type":"SystemAssigned, UserAssigned",
           "identityIds":[  
              "/subscriptions/<<SUBSCRIPTION ID>>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1",
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2"
           ]
        }
     }
    

从 Azure VM 禁用系统分配的托管标识

若要在 VM 上禁用系统分配的托管标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。

  1. 获取 Bearer 类型的访问令牌,在下一步中,您将在授权标头中使用该令牌来创建具有系统分配托管标识的 VM。

    az account get-access-token
    
  2. 使用 CURL 调用 Azure Resource Manager REST 终结点,更新虚拟机以禁用系统分配的托管身份。 下面的示例禁用名为 {"identity":{"type":"None"}} 的 VM 中由请求正文中的值 标识的系统分配的托管标识。 将 <ACCESS TOKEN> 替换为您在上一步请求 Bearer 访问令牌时收到的值,并根据您的环境适当地替换 <SUBSCRIPTION ID> 值。

    重要

    若要确保不删除用户分配给 VM 的任何现有托管标识,需要使用以下 CURL 命令列出用户分配的托管标识:curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/virtualMachines/<VM NAME>?api-version=2018-06-01' -H "Authorization: Bearer <ACCESS TOKEN>"。 如果具有用户分配给 VM 的任何托管标识(响应中用值 identity 进行标识),请跳过步骤 3,该步骤介绍了如何在 VM 上禁用系统分配的托管标识的同时保留用户分配的托管标识。

    curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"None"}}' -H "Content-Type: application/json" -H "Authorization:Bearer <ACCESS TOKEN>"
    
    PATCH https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    请求正文

     {  
        "identity":{  
           "type":"None"
        }
     }
    

    如果使用的是 API 版本 2018-06-01,若要从具有用户分配托管标识的虚拟机中删除系统分配的托管标识,请从 SystemAssigned 值中删除 {"identity":{"type:" "}},同时保留 UserAssigned 值 和 userAssignedIdentities 字典值。 如果使用的是 API 版本 2017-12-01 或早期版本,请保留 identityIds 数组。

用户分配的托管标识

本部分介绍如何使用 CURL 在 Azure VM 上添加和删除用户分配的托管标识,以调用 Azure Resource Manager REST 终结点。

在创建 Azure VM 期间分配用户分配的托管标识

若要将用户分配标识分配给 VM,你的帐户需要具有虚拟机参与者托管标识操作员角色分配。 不需要其他 Microsoft Entra 目录角色分配。

  1. 获取 Bearer 类型的访问令牌,在下一步中,您将在授权标头中使用该令牌来创建具有系统分配托管标识的 VM。

    az account get-access-token
    
  2. 为 VM 创建网络接口

     az network nic create -g myResourceGroup --vnet-name myVnet --subnet mySubnet -n myNic
    
  3. 获取 Bearer 类型的访问令牌,在下一步中,您将在授权标头中使用该令牌来创建具有系统分配托管标识的 VM。

    az account get-access-token
    
  4. 按照此处的说明创建用户分配的托管标识:创建用户分配的托管标识

  5. 使用 CURL 创建 VM 以调用Azure Resource Manager REST 终结点。 下面的示例在资源组“myResourceGroup”中创建名为“myVM”的 VM,该 VM 具有用户分配的托管标识 ID1(请求正文中用值 "identity":{"type":"UserAssigned"} 进行标识)。 将 <ACCESS TOKEN> 替换为您在上一步请求 Bearer 访问令牌时收到的值,并根据您的环境适当地替换 <SUBSCRIPTION ID> 值。

    API 版本 2018-06-01

    curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01' -X PUT -d '{"location":"chinanorth2","name":"myVM","identity":{"type":"UserAssigned","identityIds":["/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"]},"properties":{"hardwareProfile":{"vmSize":"Standard_D2_v2"},"storageProfile":{"imageReference":{"sku":"2016-Datacenter","publisher":"MicrosoftWindowsServer","version":"latest","offer":"WindowsServer"},"osDisk":{"caching":"ReadWrite","managedDisk":{"storageAccountType":"StandardSSD_LRS"},"name":"myVM3osdisk","createOption":"FromImage"},"dataDisks":[{"diskSizeGB":1023,"createOption":"Empty","lun":0},{"diskSizeGB":1023,"createOption":"Empty","lun":1}]},"osProfile":{"adminUsername":"azureuser","computerName":"myVM","adminPassword":"myPassword12"},"networkProfile":{"networkInterfaces":[{"id":"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNic","properties":{"primary":true}}]}}}' -H "Content-Type: application/json" -H "Authorization: Bearer <ACCESS TOKEN>"
    
    PUT https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    请求正文

     {  
        "location":"chinanorth2",
        "name":"myVM",
        "identity":{  
           "type":"UserAssigned",
           "identityIds":[  
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"
           ]
        },
        "properties":{  
           "hardwareProfile":{  
              "vmSize":"Standard_D2_v2"
           },
           "storageProfile":{  
              "imageReference":{  
                 "sku":"2016-Datacenter",
                 "publisher":"MicrosoftWindowsServer",
                 "version":"latest",
                 "offer":"WindowsServer"
              },
              "osDisk":{  
                 "caching":"ReadWrite",
                 "managedDisk":{  
                    "storageAccountType":"StandardSSD_LRS"
                 },
                 "name":"myVM3osdisk",
                 "createOption":"FromImage"
              },
              "dataDisks":[  
                 {  
                    "diskSizeGB":1023,
                    "createOption":"Empty",
                    "lun":0
                 },
                 {  
                    "diskSizeGB":1023,
                    "createOption":"Empty",
                    "lun":1
                 }
              ]
           },
           "osProfile":{  
              "adminUsername":"azureuser",
              "computerName":"myVM",
              "adminPassword":"myPassword12"
           },
           "networkProfile":{  
              "networkInterfaces":[  
                 {  
                    "id":"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNic",
                    "properties":{  
                       "primary":true
                    }
                 }
              ]
           }
        }
     }
    
    

    API 版本 2017-12-01

    curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01' -X PUT -d '{"location":"chinanorth2","name":"myVM","identity":{"type":"UserAssigned","identityIds":["/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"]},"properties":{"hardwareProfile":{"vmSize":"Standard_D2_v2"},"storageProfile":{"imageReference":{"sku":"2016-Datacenter","publisher":"MicrosoftWindowsServer","version":"latest","offer":"WindowsServer"},"osDisk":{"caching":"ReadWrite","managedDisk":{"storageAccountType":"StandardSSD_LRS"},"name":"myVM3osdisk","createOption":"FromImage"},"dataDisks":[{"diskSizeGB":1023,"createOption":"Empty","lun":0},{"diskSizeGB":1023,"createOption":"Empty","lun":1}]},"osProfile":{"adminUsername":"azureuser","computerName":"myVM","adminPassword":"myPassword12"},"networkProfile":{"networkInterfaces":[{"id":"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNic","properties":{"primary":true}}]}}}' -H "Content-Type: application/json" -H "Authorization: Bearer <ACCESS TOKEN>"
    
    PUT https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "location":"chinanorth2",
        "name":"myVM",
        "identity":{
           "type":"UserAssigned",
           "identityIds":[
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"
           ]
        },
        "properties":{
           "hardwareProfile":{
              "vmSize":"Standard_D2_v2"
           },
           "storageProfile":{
              "imageReference":{
                 "sku":"2016-Datacenter",
                 "publisher":"MicrosoftWindowsServer",
                 "version":"latest",
                 "offer":"WindowsServer"
              },
              "osDisk":{
                 "caching":"ReadWrite",
                 "managedDisk":{
                    "storageAccountType":"StandardSSD_LRS"
                 },
                 "name":"myVM3osdisk",
                 "createOption":"FromImage"
              },
              "dataDisks":[
                 {
                    "diskSizeGB":1023,
                    "createOption":"Empty",
                    "lun":0
                 },
                 {
                    "diskSizeGB":1023,
                    "createOption":"Empty",
                    "lun":1
                 }
              ]
           },
           "osProfile":{
              "adminUsername":"azureuser",
              "computerName":"myVM",
              "adminPassword":"myPassword12"
           },
           "networkProfile":{
              "networkInterfaces":[
                 {
                    "id":"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myNic",
                    "properties":{
                       "primary":true
                    }
                 }
              ]
           }
        }
     }
    

将用户分配的托管标识分配给现有Azure VM

若要将用户分配标识分配给 VM,你的帐户需要具有虚拟机参与者托管标识操作员角色分配。 不需要其他 Microsoft Entra 目录角色分配。

  1. 获取 Bearer 类型的访问令牌,在下一步中,您将在授权标头中使用该令牌来创建具有系统分配托管标识的 VM。

    az account get-access-token
    
  2. 按照此处的说明创建用户分配的托管标识:创建用户分配的托管标识

  3. 若要确保不删除用户或系统分配给 VM 的现有托管标识,需要使用以下 CURL 命令列出分配给 VM 的标识。 如果虚拟机规模集被分配了托管标识,这些标识将列在 identity 值下。

    curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/virtualMachines/<VM NAME>?api-version=2018-06-01' -H "Authorization: Bearer <ACCESS TOKEN>" 
    
    GET https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/virtualMachines/<VM NAME>?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    授权 必填 设置为有效的 Bearer 访问令牌。

    如果你将任何用户或系统分配的托管标识分配给 VM(如响应中的 identity 值所标识),请跳过步骤 5,该步骤展示了如何在 VM 上保留系统分配的托管标识,同时添加用户分配的托管标识。

  4. 如果您的虚拟机没有任何用户分配的托管身份标识,请使用以下 CURL 命令调用 Azure Resource Manager REST 端点,为虚拟机分配第一个用户分配的托管身份标识。

    下面的示例将用户分配的托管标识 ID1 分配给资源组 myResourceGroup 中名为 myVM 的 VM。 将 <ACCESS TOKEN> 替换为您在上一步请求 Bearer 访问令牌时收到的值,并根据您的环境适当地替换 <SUBSCRIPTION ID> 值。

    API 版本 2018-06-01

    curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"UserAssigned", "userAssignedIdentities":{"/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{}}}}' -H "Content-Type: application/json" -H "Authorization:Bearer <ACCESS TOKEN>"
    
    PATCH https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"UserAssigned",
           "userAssignedIdentities":{
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{
    
              }
           }
        }
     }
    

    API 版本 2017-12-01

    curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01' -X PATCH -d '{"identity":{"type":"userAssigned", "identityIds":["/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"]}}' -H "Content-Type: application/json" -H "Authorization:Bearer <ACCESS TOKEN>"
    
    PATCH https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"userAssigned",
           "identityIds":[
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"
           ]
        }
     }
    
  5. 如果您的虚拟机拥有已分配的用户分配或系统分配的托管标识:

    API 版本 2018-06-01

    将用户分配的托管标识添加到 userAssignedIdentities 字典值。

    例如,如果你具有当前分配给虚拟机的系统分配的托管标识和用户分配的托管标识 ID1 并希望将用户分配的托管标识 ID2 添加到该虚拟机,则:

    curl  'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"SystemAssigned, UserAssigned", "userAssignedIdentities":{"/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{},"/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2":{}}}}' -H "Content-Type: application/json" -H "Authorization:Bearer <ACCESS TOKEN>"
    
    PATCH https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"SystemAssigned, UserAssigned",
           "userAssignedIdentities":{
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{
    
              },
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2":{
    
              }
           }
        }
     }
    

    API 版本 2017-12-01

    identityIds 数组值中保留要保持的用户分配的托管标识,同时添加新的用户分配的托管标识。

    例如,如果你具有当前分配给虚拟机的系统分配的托管标识和用户分配的托管标识 ID1 并希望将用户分配的托管标识 ID2 添加到该虚拟机,则:

    curl  'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01' -X PATCH -d '{"identity":{"type":"SystemAssigned,UserAssigned", "identityIds":["/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1","/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2"]}}' -H "Content-Type: application/json" -H "Authorization:Bearer <ACCESS TOKEN>"
    
    PATCH https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"SystemAssigned,UserAssigned",
           "identityIds":[
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1",
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2"
           ]
        }
     }
    

从 Azure VM 中删除用户分配的托管标识

若要从 VM 中删除用户分配的标识,你的帐户需要虚拟机参与者角色分配。

  1. 获取 Bearer 类型的访问令牌,在下一步中,您将在授权标头中使用该令牌来创建具有系统分配托管标识的 VM。

    az account get-access-token
    
  2. 若要确保不删除任何现有用户分配的托管标识(希望保留在 VM 上)或不删除系统分配的托管标识,需要使用以下 CURL 命令列出这些托管标识:

    curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/virtualMachines/<VM NAME>?api-version=2018-06-01' -H "Authorization: Bearer <ACCESS TOKEN>"
    
    GET https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/virtualMachines/<VM NAME>?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    如果具有分配给 VM 的托管身份,则这些身份将在 identity 值中列出。

    例如,如果你有分配给 VM 的用户分配的托管标识 ID1ID2,并且仅希望保持分配 ID1 并保留系统分配的标识:

    API 版本 2018-06-01

    null 添加到要删除的用户分配的托管标识:

    curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"SystemAssigned, UserAssigned", "userAssignedIdentities":{"/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2":null}}}' -H "Content-Type: application/json" -H "Authorization:Bearer <ACCESS TOKEN>"
    
    PATCH https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"SystemAssigned, UserAssigned",
           "userAssignedIdentities":{
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2":null
           }
        }
     }
    

    API 版本 2017-12-01

    identityIds 数组中仅保留要保持的用户分配的托管标识:

    curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01' -X PATCH -d '{"identity":{"type":"SystemAssigned, UserAssigned", "identityIds":["/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"]}}' -H "Content-Type: application/json" -H "Authorization:Bearer <ACCESS TOKEN>"
    
    PATCH https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    内容类型 必填 设置为 application/json
    授权 必填 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"SystemAssigned, UserAssigned",
           "identityIds":[
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"
           ]
        }
     }
    

如果 VM 同时具有系统分配的托管标识和用户分配的托管标识,则可通过使用以下命令切换为仅使用系统分配的托管标识,删除所有用户分配的托管标识:

curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"SystemAssigned"}}' -H "Content-Type: application/json" -H "Authorization:Bearer <ACCESS TOKEN>"
PATCH https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1

请求标头

请求标头 说明
内容类型 必填 设置为 application/json
授权 必填 设置为有效的 Bearer 访问令牌。

请求正文

{
   "identity":{
      "type":"SystemAssigned"
   }
}

如果 VM 只具有用户分配的托管标识并希望删除所有这些托管标识,请使用以下命令:

curl 'https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"None"}}' -H "Content-Type: application/json" -H Authorization:"Bearer <ACCESS TOKEN>"
PATCH https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1

请求标头

请求标头 说明
内容类型 必填 设置为 application/json
授权 必填 设置为有效的 Bearer 访问令牌。

请求正文

{
   "identity":{
      "type":"None"
   }
}

后续步骤

有关如何使用 REST 创建、列出或删除用户分配的托管标识,请参阅:

本文介绍如何使用Azure SDK为Azure VM 启用和删除Azure资源的托管标识。

必备条件

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

Azure SDKs 支持 Azure 资源的托管标识

Azure通过一系列 Azure SDKs 支持多个编程平台。 其中几个已更新,以支持Azure资源的托管标识,并提供相应的示例来演示使用情况。 由于添加了其他支持,此列表已更新:

SDK 示例
.NET 使用启用了 Azure 资源托管标识的 VM 来管理资源
Java 管理已启用托管身份的 Azure 资源的 VM 的存储
Node.js 创建启用了系统分配的托管标识的 VM
Python 创建启用了系统分配的托管标识的 VM
Ruby 创建启用了系统分配标识的Azure VM

后续步骤

  • 请参阅 配置 Azure VM 的标识下的相关文章,了解如何使用 Azure 门户、PowerShell、CLI 和资源模板。