使用 Azure CLI 将应用角色分配给托管身份

Azure 资源的托管标识在 Microsoft Entra ID 中为 Azure 服务提供了一个标识。 它们无需在代码中使用凭据即可工作。 Azure 服务使用此标识向支持 Microsoft Entra 身份验证的服务证明身份。 应用程序角色提供了一种基于角色的访问控制形式,并允许服务实现授权规则。

注释

应用程序收到的令牌由底层基础结构缓存。 这意味着,对托管标识角色的任何更改都可能需要大量时间来处理。 有关详细信息,请参阅使用托管标识进行授权的限制。

本文介绍如何使用 Microsoft Graph PowerShell SDK 或 Azure CLI 将托管标识分配给由另一个应用程序公开的应用程序角色。

先决条件

使用 CLI 将托管标识访问权限分配给另一应用程序的应用角色

  • 如需在本地运行 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。

  1. 在 Azure 资源上启用托管标识,如 Azure 虚拟机。

  2. 查找托管标识的服务主体的对象 ID。

    • 对于系统分配的托管标识,可在 Azure 门户中资源的“标识”页上找到对象 ID 。 还可使用以下脚本查找对象 ID。 需要前面步骤中所创建资源的资源 ID,可在 Azure 门户中资源的“属性”页上找到该 ID。

      resourceIdWithManagedIdentity="/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.Compute/virtualMachines/{my virtual machine name}"
      
      oidForMI=$(az resource show --ids $resourceIdWithManagedIdentity --query "identity.principalId" -o tsv | tr -d '[:space:]')
      echo "object id for managed identity is: $oidForMI"
      
    • 对于用户分配的托管标识,可在 Azure 门户中资源的“概述”页上找到托管标识的对象 ID 。 还可使用以下脚本查找对象 ID。 你将需要用户分配的托管标识的资源 ID。

      userManagedIdentityResourceId="/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{my managed identity name}"
      
      oidForMI=$(az resource show --id $userManagedIdentityResourceId --query "properties.principalId" -o tsv | tr -d '[:space:]')
      echo "object id for managed identity is: $oidForMI"
      
  3. 创建新的应用程序注册 来表示托管标识向其发送请求的服务。

    • 如果公开向托管标识授予的应用角色的 API 或服务在 Microsoft Entra 租户中已有服务主体,请跳过此步骤。
  4. 查找服务应用程序的服务主体的对象 ID。 可以使用 Microsoft Entra 管理中心找到此信息。

    1. 登录到 Microsoft Entra 管理中心。

    2. 在左侧边栏中,选择 Entra ID>企业应用。 然后找到该应用程序并查看“对象 ID”。

    3. 还可以使用以下脚本,按照服务主体的对象 ID 的显示名称找到此 ID:

      appName="{name for your application}"
      serverSPOID=$(az ad sp list --filter "displayName eq '$appName'" --query '[0].id' -o tsv | tr -d '[:space:]')
      echo "object id for server service principal is: $serverSPOID"
      

      注释

      应用程序的显示名称不是唯一的,因此,应验证是否获取了正确的应用程序服务主体。

    4. 或者,可以通过应用程序注册的唯一应用程序 ID 查找对象 ID:

      appID="{application id for your application}"
      serverSPOID=$(az ad sp list --filter "appId eq '$appID'" --query '[0].id' -o tsv | tr -d '[:space:]')
      echo "object id for server service principal is: $serverSPOID"
      
  5. 为上一步骤中创建的应用程序添加应用角色。 可以使用 Azure 门户或使用 Microsoft Graph 来创建角色。 例如,可以添加如下应用角色:

    {
        "allowedMemberTypes": [
            "Application"
        ],
        "displayName": "Read data from MyApi",
        "id": "00001111-aaaa-2222-bbbb-3333cccc4444",
        "isEnabled": true,
        "description": "Allow the application to read data as itself.",
        "value": "MyApi.Read.All"
    }
    
  6. 将应用角色分配给托管标识。 你将需要以下信息来分配应用角色:

    • managedIdentityObjectId:在步骤 2 中找到的托管标识服务主体的对象 ID。
    • serverServicePrincipalObjectId:在步骤 4 中找到的服务器应用程序服务主体的对象 ID。
    • appRoleId:在步骤 5 中生成的服务器应用公开的应用角色 ID,此示例中的应用角色 ID 为 00000000-0000-0000-0000-000000000000。
  7. 执行以下脚本以添加角色分配。 不直接在 Azure CLI 上公开此功能,而是在此处使用 REST 命令:

    roleguid="00000000-0000-0000-0000-000000000000"
    az rest -m POST -u https://microsoftgraph.chinacloudapi.cn/v1.0/servicePrincipals/$oidForMI/appRoleAssignments -b "{\"principalId\": \"$oidForMI\", \"resourceId\": \"$serverSPOID\",\"appRoleId\": \"$roleguid\"}"
    

后续步骤