將受控識別存取權指派給應用程式角色
適用於 Azure 資源的受控識別會在 Microsoft Entra ID 中為 Azure 服務提供識別。 此作業不需要您程式碼中的認證即可運作。 Azure 服務使用此身分識別,向支援 Microsoft Entra 驗證的服務進行驗證。 應用程式角色提供一種以角色為基礎的存取控制形式,並允許服務實作授權規則。
注意
應用程式收到的權杖會由基礎結構進行快取。 這表示受控識別角色的任何變更都可能需要相當長的時間來處理。 如需詳細資訊,請參閱使用受控識別授權的限制。
在本文中,您將了解如何使用 Microsoft Graph PowerShell SDK,將受控識別指派給另一個應用程式公開的應用程式角色。
必要條件
- 如果不熟悉 Azure 資源的受控識別,請參閱適用於 Azure 資源的受控識別概觀。
- 請檢閱系統指派和使用者指派受控識別之間的差異。
- 如果您還沒有 Azure 帳戶,請先註冊免費帳戶,再繼續進行。
使用 PowerShell 將受控識別存取權指派給另一個應用程式的應用程式角色
若要執行範例指令碼,您有兩個選項:
- 使用 Azure Cloud Shell,您可以使用程式碼區塊右上角的 [試用] 按鈕來開啟此服務。
- 安裝最新版本的 Microsoft Graph PowerShell SDK,以在本地執行指令碼。
您在 Azure 資源 (例如 Azure VM) 上啟用受控識別。
尋找受控識別之服務主體的物件識別碼。
對於系統指派的受控識別,您可以在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
建立新的應用程式註冊,以代表您要讓受控識別向其傳送要求的服務。
- 如果公開應用程式角色授與受控識別的 API 或服務,在您的 Microsoft Entra 租用戶中已有服務主體,請跳過此步驟。 例如,如果您想要將受控識別存取權授與 Microsoft Graph API。
尋找服務應用程式服務主體的物件識別碼。 您可以使用 Azure 入口網站找到此識別碼。
- 例如,移至 Microsoft Entra ID,然後開啟 [企業應用程式] 頁面。 然後尋找應用程式並尋找物件識別碼。
- 您也可以使用下列 PowerShell 指令碼,依據其顯示名稱來尋找服務主體的物件識別碼:
$serverServicePrincipalObjectId = (Get-MgServicePrincipal -Filter "DisplayName eq '$applicationName'").Id
注意
應用程式的顯示名稱不是唯一的,因此,您應該確認是否取得正確的應用程式服務主體。
將應用程式角色新增至您在上一個步驟中建立的應用程式。 接著,您可以使用 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" } ] }
將應用程式角色指派給受控識別。 您需要下列資訊來指派應用程式角色:
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 將受控識別存取權指派給另一個應用程式的應用程式角色
在 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 資源 (例如 Azure 虛擬機器) 上啟用受控識別。
尋找受控識別之服務主體的物件識別碼。
- 對於系統指派的受控識別,您可以在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"
建立新的應用程式註冊,以代表您的受控識別向其傳送要求的服務。
- 如果公開應用程式角色授與受控識別的 API 或服務,在您的 Microsoft Entra 租用戶中已有服務主體,請跳過此步驟。
尋找服務應用程式服務主體的物件識別碼。 您可以使用 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"
將應用程式角色新增至您在上一個步驟中建立的應用程式。 您可以使用 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" }
將應用程式角色指派給受控識別。 您需要下列資訊來指派應用程式角色:
managedIdentityObjectId
:受控識別服務主體的物件識別碼,您可以在步驟 2 中找到。serverServicePrincipalObjectId
:伺服器應用程式服務主體的物件識別碼,您可以在步驟 4 中找到。appRoleId
:由伺服器應用程式公開的應用程式角色識別碼,這是您在步驟 5 中產生的識別碼 - 在此範例中,應用程式角色識別碼為00000000-0000-0000-0000-000000000000
。
執行下列指令碼以新增角色指派。 此功能不會直接在 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\"}"
下一步
- 適用於 Azure 資源的受控識別概觀
- 若要在 Azure VM 上啟用受控識別,請參閱在 Azure VM 上設定 Azure 資源的受控識別。