Atribuir um acesso de identidade gerenciada a uma função de aplicativo usando o PowerShell
As identidades gerenciadas para recursos do Azure fornecem aos serviços do Azure uma identidade no Microsoft Entra ID. Elas funcionam sem a necessidade de credenciais em seu código. Os serviços do Azure usam esta identidade para autenticar os serviços que dão suporte à autenticação do Microsoft Entra. As funções de aplicativo oferecem uma forma de controle de acesso baseado em função e permitem que um serviço implemente regras de autorização.
Observação
Os tokens recebidos pelo aplicativo são armazenados em cache pela infraestrutura subjacente, o que significa que qualquer alteração nas funções da identidade gerenciada pode levar bastante tempo para entrar em vigor. Para obter mais informações, consulte Limitação no uso de identidades gerenciadas para autorização.
Neste artigo, você aprenderá a atribuir uma identidade gerenciada a uma função de aplicativo exposta por outro aplicativo usando o SDK do PowerShell do Microsoft Graph.
Pré-requisitos
- Se você não estiver familiarizado com identidades gerenciadas para recursos do Azure, confira a seção de visão geral. Revise a diferença entre uma identidade gerenciada atribuída ao sistema e atribuída ao usuário.
- Se você ainda não tiver uma conta do Azure, inscreva-se em uma conta gratuita antes de continuar.
- Para executar os scripts de exemplo, você tem duas opções:
- Use o Azure Cloud Shell, que você pode abrir usando o botão Experimentar no canto superior direito dos blocos de código.
- Execute scripts localmente instalando a última versão do SDK do PowerShell do Microsoft Graph.
Atribuir um acesso de identidade gerenciada à função de aplicativo de outro aplicativo
Habilite a identidade gerenciada em um recurso do Azure, como uma VM do Azure.
Localize a ID de objeto da entidade de serviço da identidade gerenciada.
Para uma identidade gerenciada atribuída pelo sistema, você pode encontrar a ID de objeto no portal do Azure na página Identidade do recurso. Você também pode usar o seguinte script do PowerShell para localizar a ID do objeto. Você precisará da ID do recurso criado na etapa 1, que está disponível no portal do Azure na página Propriedades do recurso.
$resourceIdWithManagedIdentity = '/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.Compute/virtualMachines/{my virtual machine name}' (Get-AzResource -ResourceId $resourceIdWithManagedIdentity).Identity.PrincipalId
Para uma identidade gerenciada atribuída pelo usuário, você pode encontrar a ID do objeto da identidade gerenciada no portal do Azure na página Visão geral do recurso. Você também pode usar o seguinte script do PowerShell para localizar a ID do objeto. Você precisará da ID do recurso da identidade gerenciada atribuída pelo usuário.
$userManagedIdentityResourceId = '/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{my managed identity name}' (Get-AzResource -ResourceId $userManagedIdentityResourceId).Properties.PrincipalId
Crie um novo registro de aplicativo para representar o serviço ao qual sua identidade gerenciada enviará uma solicitação. Se a API ou o serviço que expõe a concessão da função de aplicativo para a identidade gerenciada já tiver uma entidade de serviço em seu locatário do Microsoft Entra, ignore esta etapa. Por exemplo, se você quiser conceder o acesso de identidade gerenciada à API do Microsoft Graph, poderá ignorar esta etapa.
Localize a ID do objeto da entidade de serviço do aplicativo de serviço. Você pode encontrar usando o portal do Azure. Acesse o Microsoft Entra ID, abra a página Aplicativos empresariais, localize o aplicativo e procure a ID do objeto. Você também pode encontrar a ID do objeto da entidade de serviço por seu nome de exibição usando o seguinte script do PowerShell:
$serverServicePrincipalObjectId = (Get-MgServicePrincipal -Filter "DisplayName eq '$applicationName'").Id
Observação
Nomes de exibição para aplicativos não são exclusivos. Portanto, você deve verificar se obteve a entidade de serviço do aplicativo correto.
Adicione uma função de aplicativo ao aplicativo criado na etapa 3. É possível criar a função por meio do portal do Azure ou do Microsoft Graph. Por exemplo, você pode adicionar uma função de aplicativo executando a seguinte consulta no Explorador do 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" } ] }
Atribua a função de aplicativo à identidade gerenciada. Você precisará das seguintes informações para atribuir a função de aplicativo:
managedIdentityObjectId
: a ID do objeto da entidade de serviço da identidade gerenciada, que você encontrou na etapa 2.serverServicePrincipalObjectId
: a ID do objeto da entidade de serviço do aplicativo do servidor, que você encontrou na etapa 4.appRoleId
: a ID da função de aplicativo exposta pelo aplicativo do servidor, que você gerou na etapa 5 – no exemplo, a ID da função do aplicativo é0566419e-bb95-4d9d-a4f8-ed9a0f147fa6
.
Execute o seguinte comando do PowerShell para adicionar a atribuição de função:
New-MgServicePrincipalAppRoleAssignment ` -ServicePrincipalId $serverServicePrincipalObjectId ` -PrincipalId $managedIdentityObjectId ` -ResourceId $serverServicePrincipalObjectId ` -AppRoleId $appRoleId
Script completo
Este script de exemplo mostra como atribuir uma identidade gerenciada do aplicativo Web do Azure a uma função do aplicativo.
# 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
Próximas etapas
- Identidade gerenciada para visão geral dos recursos do Azure
- Para habilitar a identidade gerenciada em uma máquina virtual do Azure, consulte Configurar identidades gerenciadas para recursos do Azure em uma VM do Azure usando o PowerShell.