在 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 上启用该托管标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。
使用已与包含 VM 的 Azure 订阅关联的帐户登录 Azure 门户。
导航到所需的虚拟机,然后选择“标识”。
在“系统分配”、“状态”下,选择“开启”,然后单击“保存”:
从 VM 删除系统分配托管标识
若要从 VM 中删除系统分配的托管标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。
如果虚拟机不再需要系统分配托管标识,请执行以下操作:
使用已与包含 VM 的 Azure 订阅关联的帐户登录 Azure 门户。
导航到所需的虚拟机,然后选择“标识”。
在“系统分配”、“状态”下,选择“关闭”,然后单击“保存”:
用户分配的托管标识
本部分介绍如何使用 Azure 门户在 VM 中添加和删除用户分配托管标识。
在创建 VM 期间分配用户分配标识
若要将用户分配的标识分配给 VM,你的帐户需要虚拟机参与者和托管标识操作员角色分配。 不需要其他 Microsoft Entra 目录角色分配。
当前,Azure 门户不支持在创建 VM 期间分配用户分配托管标识。 请改为参考以下 VM 创建快速入门文章之一来首先创建 VM,然后前进到下一部分来了解有关为 VM 分配用户分配托管标识的详细信息:
向现有 VM 分配用户分配托管标识
若要将用户分配的标识分配给 VM,你的帐户需要虚拟机参与者和托管标识操作员角色分配。 不需要其他 Microsoft Entra 目录角色分配。
使用已与包含 VM 的 Azure 订阅关联的帐户登录 Azure 门户。
导航到所需的 VM,依次单击“标识”、“用户分配”和“+添加”。
单击要添加到 VM 的用户分配的标识,然后单击“添加”。
从 VM 中删除用户分配托管标识
若要从 VM 中删除用户分配的标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。
使用已与包含 VM 的 Azure 订阅关联的帐户登录 Azure 门户。
导航到所需的 VM,然后依次单击“标识”、“用户分配”、要删除的用户分配托管标识,然后选择“删除”(在确认窗格中单击“是”)。
后续步骤
- 使用 Azure 门户,授予 Azure VM 的托管标识对另一个 Azure 资源的访问权限。
本文介绍如何使用 Azure CLI 在 Azure VM 上执行以下 Azure 资源托管标识操作:
- 在 Azure VM 上启用和禁用系统分配托管标识
- 在 Azure VM 上添加和删除用户分配托管标识
如果没有 Azure 帐户,请在继续前注册免费帐户。
必备条件
- 如果你不熟悉 Azure 资源托管标识,请参阅什么是 Azure 资源托管标识?。 若要了解系统分配的托管标识和用户分配的托管标识类型,请参阅托管标识类型。
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 中的 Bash 快速入门。
如需在本地运行 CLI 参考命令,请安装 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 VM,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。
运行 az group create,创建用于容纳和部署 VM 及其相关资源的资源组。 如果已有要改用的资源组,可以跳过这一步:
az group create --name myResourceGroup --location westus
运行 az vm create 创建 VM。 以下示例根据 参数的请求,使用指定的
--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 mySubscription --admin-username azureuser --admin-password myPassword12
在现有 Azure VM 上启用系统分配托管标识
若要在 VM 上启用系统分配的托管标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。
如果在本地控制台中使用 Azure CLI,首先请使用 az login 登录到 Azure。 使用与包含 VM 的 Azure 订阅关联的帐户。
az login
将 az vm identity assign 与
identity 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 目录角色分配。
如果已有要使用的资源组,可跳过此步骤。 使用 az group create 创建用于包含和部署用户分配托管标识的资源组。 请务必将
<RESOURCE GROUP>
和<LOCATION>
参数值替换为自己的值。 解码的字符:az group create --name <RESOURCE GROUP> --location <LOCATION>
使用 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=aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb", "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" }
运行 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 目录角色分配。
使用 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=aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb", "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" }
使用 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 资源的托管标识概述
- 有关完整的 Azure VM 创建快速入门,请参阅:
在本文中,你将了解如何在 Azure VM 上使用 PowerShell 执行 Azure 资源的托管标识的以下操作。
注意
建议使用 Azure Az PowerShell 模块与 Azure 交互。 请参阅安装 Azure PowerShell 以开始使用。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az。
必备条件
- 如果不熟悉 Azure 资源的托管标识,请查阅概述部分。 请务必了解系统分配的托管标识与用户分配的托管标识之间的差异。
- 如果没有 Azure 帐户,请在继续前注册免费帐户。
- 若要运行示例脚本,有两个选项:
- 使用 Azure Cloud Shell,你可使用代码块右上角的“试用”按钮打开它。
- 通过安装最新版的 Azure PowerShell 在本地运行脚本,然后使用
Connect-AzAccount
登录到 Azure。
系统分配的托管标识
在此部分,我们将介绍如何使用 Azure PowerShell 来启用和禁用系统分配的托管标识。
在创建 Azure VM 的过程中启用系统分配托管标识
若要创建启用了系统分配的托管标识的 Azure VM,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。
请参阅以下 Azure VM 快速入门之一,仅完成必要部分(“登录到 Azure”、“创建资源组”、“创建网络组”、“创建 VM”)。
转到“创建 VM”部分时,需要对 New-AzVMConfig cmdlet 语法稍做修改。 务必添加
-IdentityType SystemAssigned
参数,以预配启用了系统分配标识的 VM,例如:$vmConfig = New-AzVMConfig -VMName myVM -IdentityType SystemAssigned ...
在现有 Azure VM 上启用系统分配托管标识
若要在最初未预配系统分配的托管标识的 VM 上启用该托管标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。
使用
Get-AzVM
cmdlet 检索 VM 属性。 然后,若要启用系统分配的托管标识,请在-IdentityType
cmdlet 中使用 开关:$vm = Get-AzVM -ResourceGroupName myResourceGroup -Name myVM Update-AzVM -ResourceGroupName myResourceGroup -VM $vm -IdentityType SystemAssigned
将 VM 系统分配的标识添加到组
在 VM 上启用系统分配的标识后,可以将其添加到组中。 以下过程将 VM 的系统分配的标识添加到组。
检索并记下 VM 服务主体的
ObjectID
(在返回值的Id
字段中指定):Get-AzADServicePrincipal -displayname "myVM"
检索并记下组中的
ObjectID
(在返回值的Id
字段中指定):Get-AzADGroup -searchstring "myGroup"
将 VM 的服务主体添加到组:
New-MgGroupMember -GroupId "<Id of group>" -DirectoryObjectId "<Id of VM service principal>"
从 Azure VM 中禁用系统分配的托管标识
若要在 VM 上禁用系统分配的托管标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。
如果某个虚拟机不再需要系统分配的托管标识,但仍需要用户分配的托管标识,请使用以下 cmdlet:
使用
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 目录角色分配。
请参阅以下 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 目录角色分配。
使用 New-AzUserAssignedIdentity cmdlet 创建用户分配的托管标识。 请记下输出中的
Id
,因为下一步需用到此信息。重要
创建用户分配的托管标识时仅支持字母数字、下划线和连字符(0-9 或 a-z 或 A-Z、_ 或 -)字符。 此外,名称的长度应限制为 3 到 128 个字符,这样分配给 VM/VMSS 才能正常工作。 有关详细信息,请参阅 FAQ 和已知问题
New-AzUserAssignedIdentity -ResourceGroupName <RESOURCEGROUP> -Name <USER ASSIGNED IDENTITY NAME>
使用
Get-AzVM
cmdlet 检索 VM 属性。 然后,若要向 Azure VM 分配用户分配的托管标识,请在-IdentityType
cmdlet 中使用-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 VM 上使用 Azure 资源管理器部署模板来执行以下 Azure 资源的托管标识操作:
必备条件
- 如果不熟悉 Azure 管理器部署模板,请查看概述部分。 请务必了解系统分配的托管标识与用户分配的托管标识之间的差异。
- 如果没有 Azure 帐户,请在继续前注册免费帐户。
Azure Resource Manager 模板
与 Azure 门户和脚本一样,Azure 资源管理器模板可用于部署由 Azure 资源组定义的新资源或修改后的资源。 有多种可用于执行模板编辑和部署的方法(包括本地方法和基于门户的方法),包括:
- 使用 Azure 市场中的自定义模板,这样可以从头开始创建模板,也可以在现有常见模板或快速启动模板的基础之上操作。
- 派生自现有资源组,具体方法是从原始部署或当前部署导出模板。
- 使用本地 JSON 编辑器(例如 VS Code),然后使用 PowerShell 或 CLI 进行上传和部署。
- 使用 Visual Studio Azure 资源组项目同时创建和部署模板。
无论选择哪种方法,在初始部署和重新部署期间,模板语法都是相同的。 在新的或现有 VM 上启用系统或用户分配的托管标识所采用的方式是相同的。 此外,默认情况下,Azure 资源管理器还会对部署执行增量更新。
系统分配的托管标识
在此部分中,将使用 Azure 资源管理器模板启用和禁用系统分配的托管标识。
在创建 Azure VM 的过程中或在现有 VM 上启用系统分配的托管标识
若要在 VM 上启用系统分配的托管标识,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。
无论是在本地登录到 Azure 还是通过 Azure 门户登录,请使用与包含 VM 的 Azure 订阅关联的帐户。
若要启用系统分配的托管标识,请将模板加载到编辑器中,在
Microsoft.Compute/virtualMachines
节中找到所关注的resources
资源,并在与"identity"
属性相同的级别添加"type": "Microsoft.Compute/virtualMachines"
属性。 使用以下语法:"identity": { "type": "SystemAssigned" },
完成后,以下各节应当会添加到模板的
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 目录角色分配。
无论是在本地登录到 Azure 还是通过 Azure 门户登录,请使用与包含 VM 的 Azure 订阅关联的帐户。
将模板加载到编辑器,并在
Microsoft.Compute/virtualMachines
部分找到相关的resources
资源。 如果 VM 只有系统分配的托管标识,则可以将标识类型更改为None
来禁用它。Microsoft.Compute/virtualMachines API 版本 2018-06-01
如果 VM 同时具有系统和用户分配的托管标识,请从标识类型中删除
SystemAssigned
并保留UserAssigned
以及userAssignedIdentities
字典值。Microsoft.Compute/virtualMachines API 版本 2018-06-01
如果
apiVersion
为2017-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 目录角色分配。
在
resources
元素下添加以下条目,以向 VM 分配用户分配的托管标识。 请务必将<USERASSIGNEDIDENTITY>
替换为你创建的用户分配的托管标识的名称。Microsoft.Compute/virtualMachines API 版本 2018-06-01
如果
apiVersion
为2018-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
如果
apiVersion
为2017-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>'))]" ] } }
完成后,以下各节应当会添加到模板的
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 目录角色分配。
无论是在本地登录到 Azure 还是通过 Azure 门户登录,请使用与包含 VM 的 Azure 订阅关联的帐户。
将模板加载到编辑器,并在
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 中删除单个用户分配的托管标识,请将其从
useraAssignedIdentities
字典中删除。如果具有系统分配的托管标识,请将其保持在
type
值下的identity
值中。Microsoft.Compute/virtualMachines API 版本 2017-12-01
若要从 VM 中删除单个用户分配的托管标识,请将其从
identityIds
数组中删除。如果具有系统分配的托管标识,请将其保持在
type
值下的identity
值中。
后续步骤
本文将介绍如何在 Azure VM 上通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用来执行以下 Azure 资源的托管标识操作:
- 在 Azure VM 上启用和禁用系统分配托管标识
- 在 Azure VM 上添加和删除用户分配托管标识
如果没有 Azure 帐户,请在继续前注册免费帐户。
必备条件
- 如果你不熟悉 Azure 资源托管标识,请参阅什么是 Azure 资源托管标识?。 若要了解系统分配的托管标识和用户分配的托管标识类型,请参阅托管标识类型。
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 中的 Bash 快速入门。
如需在本地运行 CLI 参考命令,请安装 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 VM 上通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用来启用和禁用系统分配的托管标识。
在创建 Azure VM 的过程中启用系统分配托管标识
若要创建启用了系统分配的托管标识的 Azure VM,你的帐户需要虚拟机参与者角色分配。 不需要其他 Microsoft Entra 目录角色分配。
运行 az group create,创建用于容纳和部署 VM 及其相关资源的资源组。 如果已有要改用的资源组,可以跳过这一步:
az group create --name myResourceGroup --location westus
为 VM 创建网络接口:
az network nic create -g myResourceGroup --vnet-name myVnet --subnet mySubnet -n myNic
检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的 VM。
az account get-access-token
借助 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 目录角色分配。
检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的 VM。
az account get-access-token
使用以下 CURL 命令对 Azure 资源管理器 REST 终结点进行调用,为名为“myVM”
{"identity":{"type":"SystemAssigned"}
的 VM 启用系统分配的托管标识(在请求正文中用值 进行标识)。 请将<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" } }
要在具有现有用户分配的托管标识的 VM 上启用系统分配的托管标识,需要将
SystemAssigned
添加到type
值。例如,如果 VM 具有用户分配给它的托管标识
ID1
和ID2
并且你希望将系统分配的托管标识添加到该 VM,请使用以下 CURL 调用。 将<ACCESS TOKEN>
和<SUBSCRIPTION ID>
替换为适合环境的值。API 版本
2018-06-01
以字典格式将用户分配的托管标识存储在userAssignedIdentities
值中,而 API 版本identityIds
则以数组格式将托管标识存储在2017-12-01
值中。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 目录角色分配。
检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的 VM。
az account get-access-token
通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用以禁用系统分配的托管标识,更新 VM。 下面的示例从名为 myVM
{"identity":{"type":"None"}}
的 VM 禁用系统分配的托管标识(请求正文中用值 进行标识)。 请将<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
SystemAssigned
,若要从具有用户分配的托管标识的虚拟机中删除系统分配的托管标识,请从{"identity":{"type:" "}}
值中删除UserAssigned
,同时保留userAssignedIdentities
值和 字典值。 如果使用的是 API 版本 2017-12-01 或早期版本,请保留identityIds
数组。
用户分配的托管标识
本部分将介绍如何在 Azure VM 上通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用来添加和删除用户分配的托管标识。
在创建 Azure VM 的过程中分配用户分配托管标识
若要将用户分配的标识分配给 VM,你的帐户需要虚拟机参与者和托管标识操作员角色分配。 不需要其他 Microsoft Entra 目录角色分配。
检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的 VM。
az account get-access-token
为 VM 创建网络接口:
az network nic create -g myResourceGroup --vnet-name myVnet --subnet mySubnet -n myNic
检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的 VM。
az account get-access-token
按照此处的说明创建用户分配的托管标识:创建用户分配的托管标识。
通过使用 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 目录角色分配。
检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的 VM。
az account get-access-token
按照此处的说明创建用户分配的托管标识:创建用户分配的托管标识。
若要确保不删除用户或系统分配给 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 上保留系统分配的托管标识,同时添加用户分配的托管标识。如果没有用户分配给 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" ] } }
如果具有用户或系统分配给 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 中删除用户分配的标识,你的帐户需要虚拟机参与者角色分配。
检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的 VM。
az account get-access-token
若要确保不删除任何现有用户分配的托管标识(希望保留在 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 的用户分配的托管标识
ID1
和ID2
,并且仅希望保持分配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 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 和资源模板完成此操作。