共用方式為


使用 Azure CLI 將應用程式角色指派給受控識別

適用於 Azure 資源的受控識別會在 Microsoft Entra ID 中為 Azure 服務提供識別。 此作業不需要您程式碼中的認證即可運作。 Azure 服務使用此身分識別,向支援 Microsoft Entra 驗證的服務進行驗證。 應用程式角色提供一種以角色為基礎的存取控制形式,並允許服務實作授權規則。

備註

應用程式收到的權杖會由基礎結構進行快取。 這表示受控識別角色的任何變更都可能需要相當長的時間來處理。 如需詳細資訊,請參閱 使用受控識別進行授權的限制

在本文中,您將瞭解如何使用 Microsoft Graph PowerShell SDKAzure CLI,將受控識別指派給另一個應用程式所公開的應用程式角色。

先決條件

使用 CLI 將受控識別存取權指派給另一個應用程式的應用程式角色

  1. 在 Azure 資源上啟用受控識別, 例如 Azure 虛擬機

  2. 尋找受控識別之服務主體的物件識別碼。

    • 針對系統指派的受控識別,您可以在 Azure 入口網站的資源 [身分識別] 頁面上找到物件 識別碼。 您也可以使用下列指令碼來尋找物件識別碼。 您將需要在上一個步驟建立之資源的資源識別碼,您可以在 Azure 入口網站中資源的 [屬性] 頁面上取得該資源識別碼。

      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 入口網站上的資源「概觀」頁面找到該受控識別的物件識別碼。 您也可以使用下列指令碼來尋找物件識別碼。 您需要使用者指派的受控身份識別的資源識別碼。

      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. 尋找服務應用程式服務主體的物件識別碼。 您可以使用 Microsoft Entra 系統管理中心來找到此專案。

    1. 登入 Microsoft Entra 系統管理中心。

    2. 在左側導覽面板中,選取Entra ID>企業應用程式。 然後尋找應用程式並尋找 物件識別碼

    3. 您也可以使用下列指令碼,依據其顯示名稱來尋找服務主體的物件識別碼:

      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. 或者,您可以根據應用程式註冊的唯一應用程式識別碼來尋找物件識別碼:

      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 中找到。
    • serverServicePrincipalObjectId:伺服器應用程式服務主體的物件識別碼,您可以在步驟 4 中找到。
    • appRoleId:由伺服器應用程式公開的應用程式角色識別碼,這是您在步驟 5 中產生的識別碼 - 在此範例中,應用程式角色識別碼為 00000000-0000-0000-0000-000000000000
  7. 執行下列指令碼以新增角色指派。 此功能不會直接在 Azure CLI 上公開,這裡使用的是 REST 命令:

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

後續步驟