將受控識別存取權指派給應用程式角色

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

注意

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

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

必要條件

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

若要執行範例指令碼,您有兩個選項:

  1. 您在 Azure 資源 (例如 Azure VM) 上啟用受控識別。

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

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

    $resourceIdWithManagedIdentity = '/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.Compute/virtualMachines/{my virtual machine name}'
    (Get-AzResource -ResourceId $resourceIdWithManagedIdentity).Identity.PrincipalId
    

    對於使用者指派的受控識別,您可以在 Azure 入口網站中資源的 [概觀] 頁面上找到受控識別的物件識別碼。 您也可以使用下列指令碼 PowerShell 來尋找物件識別碼。 您需要使用者指派之受控識別的資源識別碼。

    $userManagedIdentityResourceId = '/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{my managed identity name}'
    (Get-AzResource -ResourceId $userManagedIdentityResourceId).Properties.PrincipalId
    
  3. 建立新的應用程式註冊,以代表您要讓受控識別向其傳送要求的服務。

    • 如果公開應用程式角色授與受控識別的 API 或服務,在您的 Microsoft Entra 租用戶中已有服務主體,請跳過此步驟。 例如,如果您想要將受控識別存取權授與 Microsoft Graph API。
  4. 尋找服務應用程式服務主體的物件識別碼。 您可以使用 Azure 入口網站找到此識別碼。

    • 例如,移至 Microsoft Entra ID,然後開啟 [企業應用程式] 頁面。 然後尋找應用程式並尋找物件識別碼
    • 您也可以使用下列 PowerShell 指令碼,依據其顯示名稱來尋找服務主體的物件識別碼:
    $serverServicePrincipalObjectId = (Get-MgServicePrincipal -Filter "DisplayName eq '$applicationName'").Id
    

    注意

    應用程式的顯示名稱不是唯一的,因此,您應該確認是否取得正確的應用程式服務主體。

  5. 應用程式角色新增至您在上一個步驟中建立的應用程式。 接著,您可以使用 Azure 入口網站或 Microsoft Graph 來建立角色。

    • 例如,您可以在 Graph 總管上執行下列查詢來新增應用程式角色:
    PATCH /applications/{id}/
    
    {
        "appRoles": [
            {
                "allowedMemberTypes": [
                    "User",
                    "Application"
                ],
                "description": "Read reports",
                "id": "1e250995-3081-451e-866c-0f6efef9c638",
                "displayName": "Report reader",
                "isEnabled": true,
                "value": "report.read"
            }
        ]
    }
    
  6. 將應用程式角色指派給受控識別。 您需要下列資訊來指派應用程式角色:

    • managedIdentityObjectId:受控識別服務主體的物件識別碼,您可以在步驟 2 中找到。
    • serverServicePrincipalObjectId:伺服器應用程式服務主體的物件識別碼,您可以在步驟 4 中找到。
    • appRoleId:由伺服器應用程式公開的應用程式角色識別碼,這是您在步驟 5 中產生的識別碼 - 在此範例中,應用程式角色識別碼為 00000000-0000-0000-0000-000000000000
    • 執行下列 PowerShell 指令碼以新增角色指派:
    New-MgServicePrincipalAppRoleAssignment `
        -ServicePrincipalId $serverServicePrincipalObjectId `
        -PrincipalId $managedIdentityObjectId `
        -ResourceId $serverServicePrincipalObjectId `
        -AppRoleId $appRoleId
    

完整的指令碼範例

此範例指令碼說明如何將 Azure Web 應用程式的受控識別指派給應用程式角色。

# Install the module.
# Install-Module Microsoft.Graph -Scope CurrentUser

# Your tenant ID (in the Azure portal, under Azure Active Directory > Overview).
$tenantID = '<tenant-id>'

# The name of your web app, which has a managed identity that should be assigned to the server app's app role.
$webAppName = '<web-app-name>'
$resourceGroupName = '<resource-group-name-containing-web-app>'

# The name of the server app that exposes the app role.
$serverApplicationName = '<server-application-name>' # For example, MyApi

# The name of the app role that the managed identity should be assigned to.
$appRoleName = '<app-role-name>' # For example, MyApi.Read.All

# Look up the web app's managed identity's object ID.
$managedIdentityObjectId = (Get-AzWebApp -ResourceGroupName $resourceGroupName -Name $webAppName).identity.principalid

Connect-MgGraph -TenantId $tenantId -Scopes 'Application.Read.All','Application.ReadWrite.All','AppRoleAssignment.ReadWrite.All','Directory.AccessAsUser.All','Directory.Read.All','Directory.ReadWrite.All'

# Look up the details about the server app's service principal and app role.
$serverServicePrincipal = (Get-MgServicePrincipal -Filter "DisplayName eq '$serverApplicationName'")
$serverServicePrincipalObjectId = $serverServicePrincipal.Id
$appRoleId = ($serverServicePrincipal.AppRoles | Where-Object {$_.Value -eq $appRoleName }).Id

# Assign the managed identity access to the app role.
New-MgServicePrincipalAppRoleAssignment `
    -ServicePrincipalId $serverServicePrincipalObjectId `
    -PrincipalId $managedIdentityObjectId `
    -ResourceId $serverServicePrincipalObjectId `
    -AppRoleId $appRoleId

使用 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. 尋找服務應用程式服務主體的物件識別碼。 您可以使用 Azure 入口網站找到此識別碼。

    • 移至 Microsoft Entra 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"
    

    注意

    應用程式的顯示名稱不是唯一的,因此,您應該確認是否取得正確的應用程式服務主體。

    或者,您可以根據應用程式註冊的唯一應用程式識別碼來尋找物件識別碼:

    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": "0566419e-bb95-4d9d-a4f8-ed9a0f147fa6",
        "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\"}"
    

下一步