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

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

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

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

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

必备条件

系统分配的托管标识

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

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

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

  • 在“标识”部分的“管理”选项卡下,将“托管服务标识”切换到“开”

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

请参阅以下快速入门以创建 VM:

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

提示

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

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

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

  2. 导航到所需的虚拟机,然后选择“标识”。

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

    显示“标识(预览)”的屏幕截图,其中“系统分配的标识”状态设置为“启用”。

从 VM 删除系统分配托管标识

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

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

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

  2. 导航到所需的虚拟机,然后选择“标识”。

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

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

用户分配的托管标识

本部分介绍如何使用 Azure 门户在 VM 中添加和删除用户分配托管标识。

在创建 VM 期间分配用户分配标识

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

当前,Azure 门户不支持在创建 VM 期间分配用户分配托管标识。 请改为参考以下 VM 创建快速入门文章之一来首先创建 VM,然后前进到下一部分来了解有关为 VM 分配用户分配托管标识的详细信息:

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

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

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

  2. 导航到所需的 VM,依次单击“标识”、“用户分配”和“+添加”。

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

  3. 单击要添加到 VM 的用户分配的标识,然后单击“添加”

    屏幕截图显示了为 VM 添加用户分配的托管标识。

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

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

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

  2. 导航到所需的 VM,然后依次单击“标识”、“用户分配”、要删除的用户分配托管标识,然后选择“删除”(在确认窗格中单击“”)。

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

后续步骤

本文介绍如何使用 Azure CLI 在 Azure VM 上执行以下 Azure 资源托管标识操作:

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

如果没有 Azure 帐户,请在继续前注册免费帐户

先决条件

系统分配的托管标识

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

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

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

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

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

    az vm create --resource-group myResourceGroup --name myVM --image win2016datacenter --generate-ssh-keys --assign-identity --role contributor --scope mySubscription --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 参数指定其名称。

    重要

    创建用户分配的托管标识时,名称必须以字母或数字开头,并且可能包含字母数字字符、连字符 (-) 和下划线 (_) 的组合。 要使虚拟机或虚拟机规模集的分配正常工作,该名称限制为 24 个字符。 有关详细信息,请参阅 FAQ 和已知问题

    az identity create -g myResourceGroup -n myUserAssignedIdentity
    

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

    {
        "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
        "clientSecretUrl": "https://control-westcentralus.identity.azure.net/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<myUserAssignedIdentity>/credentials?tid=5678&oid=9012&aid=00001111-aaaa-2222-bbbb-3333cccc4444",
        "id": "/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>",
        "location": "westcentralus",
        "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 创建 VM。 以下示例根据 --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-westcentralus.identity.azure.net/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>/credentials?tid=5678&oid=9012&aid=00001111-aaaa-2222-bbbb-3333cccc4444",
      "id": "/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>",
      "location": "westcentralus",
      "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 属性。 如果已在不同于你的 VM 的 RG 中创建用户分配的托管标识。 必须使用托管标识的 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 VM 上使用 PowerShell 执行 Azure 资源的托管标识的以下操作。

注意

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

先决条件

系统分配的托管标识

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

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

若要创建启用了系统分配的托管标识的 Azure VM,你的帐户需要虚拟机参与者角色分配。 不需要其他 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 中使用 -IdentityType 开关:

    $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. 将 VM 的服务主体添加到组:

    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/<RESROURCE 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><RESROURCE GROUP><USER ASSIGNED IDENTITY NAME> 替换为自己的值。 例如:

    $vmConfig = New-AzVMConfig -VMName <VM NAME> -IdentityType UserAssigned -IdentityID "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/<RESROURCE 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 分配用户分配的托管标识,请在 Update-AzVM cmdlet 中使用 -IdentityType-IdentityID 开关。 -IdentityId 参数的值是在上一步中记下的 Id。 将 <VM NAME><SUBSCRIPTION ID><RESROURCE 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/<RESROURCE 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 VM 上使用 Azure 资源管理器部署模板来执行以下 Azure 资源的托管标识操作:

先决条件

Azure Resource Manager 模板

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

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

系统分配的托管标识

在此部分中,将使用 Azure 资源管理器模板启用和禁用系统分配的托管标识。

在创建 Azure VM 的过程中或在现有 VM 上启用系统分配的托管标识

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

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

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

    "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 资源管理器模板分配 Azure 角色一文中找到有助于完成此步骤的详细信息。

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

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

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

  2. 将模板加载到编辑器,并在 resources 部分找到相关的 Microsoft.Compute/virtualMachines 资源。 如果 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 资源管理器模板向 Azure VM 分配用户分配的托管标识。

注意

要使用 Azure 资源管理器模板创建用户分配托管标识,请参阅创建用户分配托管标识

向 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. 将模板加载到编辑器,并在 resources 部分找到相关的 Microsoft.Compute/virtualMachines 资源。 如果 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 中删除单个用户分配的托管标识,请将其从 useraAssignedIdentities 字典中删除。

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

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

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

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

后续步骤

本文将介绍如何在 Azure VM 上通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用来执行以下 Azure 资源的托管标识操作:

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

如果没有 Azure 帐户,请在继续前注册免费帐户

先决条件

系统分配的托管标识

本节将介绍如何在 Azure VM 上通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用来启用和禁用系统分配的托管标识。

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

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

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

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

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

    az account get-access-token
    
  4. 借助 Azure Cloud Shell,通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用来创建 VM。 下面的示例创建名为 myVM 且已启用系统分配的托管标识(请求正文中用值 "identity":{"type":"SystemAssigned"} 进行标识)的 VM。 请将 <ACCESS TOKEN> 替换为上一步中请求持有者访问令牌和适合环境的 <SUBSCRIPTION ID> 值时收到的值。

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01' -X PUT -d '{"location":"westus","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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

      {
        "location":"westus",
        "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. 检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的 VM。

    az account get-access-token
    
  2. 使用以下 CURL 命令对 Azure 资源管理器 REST 终结点进行调用,为名为“myVM”的 VM 启用系统分配的托管标识(在请求正文中用值 {"identity":{"type":"SystemAssigned"} 进行标识)。 请将 <ACCESS TOKEN> 替换为上一步中请求持有者访问令牌和适合环境的 <SUBSCRIPTION ID> 值时收到的值。

    重要

    若要确保不删除用户分配给 VM 的任何现有托管标识,需要使用以下 CURL 命令列出用户分配的托管标识:curl 'https://management.azure.com/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.azure.com/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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

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

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

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

    API 版本 2018-06-01

    curl 'https://management.azure.com/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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 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.azure.com/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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 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. 检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的 VM。

    az account get-access-token
    
  2. 通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用以禁用系统分配的托管标识,更新 VM。 下面的示例从名为 myVM 的 VM 禁用系统分配的托管标识(请求正文中用值 {"identity":{"type":"None"}} 进行标识)。 请将 <ACCESS TOKEN> 替换为上一步中请求持有者访问令牌和适合环境的 <SUBSCRIPTION ID> 值时收到的值。

    重要

    若要确保不删除用户分配给 VM 的任何现有托管标识,需要使用以下 CURL 命令列出用户分配的托管标识:curl 'https://management.azure.com/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.azure.com/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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

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

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

用户分配的托管标识

本节将介绍如何在 Azure VM 上通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用来添加和删除用户分配的托管标识。

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

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

  1. 检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的 VM。

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

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

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

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

    API 版本 2018-06-01

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01' -X PUT -d '{"location":"westus","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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {  
        "location":"westus",
        "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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01' -X PUT -d '{"location":"westus","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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "location":"westus",
        "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. 检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的 VM。

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

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

    curl 'https://management.azure.com/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.azure.com/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. 如果没有用户分配给 VM 的任何托管标识,请使用以下 CURL 命令对 Azure 资源管理器 REST 终结点进行调用,以将第一个用户分配的托管标识分配给 VM。

    下面的示例将用户分配的托管标识 ID1 分配给资源组 myResourceGroup 中名为 myVM 的 VM。 请将 <ACCESS TOKEN> 替换为上一步中请求持有者访问令牌和适合环境的 <SUBSCRIPTION ID> 值时收到的值。

    API 版本 2018-06-01

    curl 'https://management.azure.com/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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

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

    API 版本 2017-12-01

    curl 'https://management.azure.com/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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"userAssigned",
           "identityIds":[
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"
           ]
        }
     }
    
  5. 如果具有用户或系统分配给 VM 的现有托管标识,则:

    API 版本 2018-06-01

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

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

    curl  'https://management.azure.com/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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 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.azure.com/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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 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. 检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的 VM。

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

    curl 'https://management.azure.com/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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/virtualMachines/<VM NAME>?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    如果具有分配给 VM 的托管标识,则这些标识会在 identity 值下列出。

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

    API 版本 2018-06-01

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

    curl 'https://management.azure.com/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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 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.azure.com/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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

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

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

curl 'https://management.azure.com/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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1

请求标头

请求标头 说明
Content-Type 必需。 设置为 application/json
授权 必需。 设置为有效的 Bearer 访问令牌。

请求正文

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

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

curl 'https://management.azure.com/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.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM?api-version=2018-06-01 HTTP/1.1

请求标头

请求标头 说明
Content-Type 必需。 设置为 application/json
授权 必需。 设置为有效的 Bearer 访问令牌。

请求正文

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

后续步骤

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

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

必备条件

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

Azure SDK 包含 Azure 资源托管标识支持

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

SDK 中 IsInRole 中的声明 示例
.NET 从具有已启用的 Azure 资源托管标识的已启用的 VM 中管理资源
Java 从具有 Azure 资源托管标识的已启用的 VM 中管理存储
Node.js 创建启用了系统分配托管标识的 VM
Python 创建启用了系统分配托管标识的 VM
Ruby 创建启用了系统分配的标识的 Azure VM

后续步骤

  • 请参阅“为 Azure VM 配置标识”下的相关文章,了解还可以如何使用 Azure 门户、PowerShell、CLI 和资源模板完成此操作 。