Partilhar via


Atribuir um acesso de identidade gerenciado a uma função de aplicativo

As identidades gerenciadas para recursos do Azure fornecem aos serviços do Azure uma identidade no Microsoft Entra ID. Eles funcionam sem precisar de credenciais em seu código. Os serviços do Azure usam essa identidade para autenticar em serviços que dão suporte à autenticação do Microsoft Entra. As funções de aplicativo fornecem uma forma de controle de acesso baseado em função e permitem que um serviço implemente regras de autorização.

Nota

Os tokens que seu aplicativo recebe são armazenados em cache pela infraestrutura subjacente. Isso significa que quaisquer alterações nas funções da identidade gerenciada podem levar um tempo significativo para serem processadas. Para obter mais informações, consulte Limitação do 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 Microsoft Graph PowerShell.

Pré-requisitos

Atribuir um acesso de identidade gerenciado à função de aplicativo de outro aplicativo usando o PowerShell

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 versão mais recente do SDK do Microsoft Graph PowerShell.
  1. Habilite a identidade gerenciada em um recurso do Azure, como uma VM do Azure.

  2. Localize o ID do objeto da entidade de serviço da identidade gerenciada.

    Para uma identidade gerenciada atribuída pelo sistema, você pode encontrar a ID do 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á do ID de 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
    
  3. Crie um novo registro de aplicativo para representar o serviço para o qual você deseja que sua identidade gerenciada envie uma solicitação.

    • Se a API ou o serviço que expõe a concessão de função do aplicativo à identidade gerenciada já tiver uma entidade de serviço em seu locatário do Microsoft Entra, ignore esta etapa. Por exemplo, no caso de você desejar conceder acesso à identidade gerenciada à API do Microsoft Graph.
  4. Localize a ID do objeto da entidade de serviço do aplicativo de serviço. Você pode encontrar isso usando o portal do Azure.

    • Por exemplo, vá para Microsoft Entra ID e abra a página de aplicativos corporativos . Em seguida, localize o aplicativo e procure o 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
    

    Nota

    Os nomes de exibição para aplicativos não são exclusivos, portanto, você deve verificar se obtém a entidade de serviço do aplicativo correta.

  5. Adicione uma função de aplicativo ao aplicativo que você criou na etapa anterior. Em seguida, você pode criar a função usando o portal do Azure ou usando o Microsoft Graph.

    • Por exemplo, você pode adicionar uma função de aplicativo executando a seguinte consulta no Graph explorer:
    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. Atribua a função do aplicativo à identidade gerenciada. Você precisará das seguintes informações para atribuir a função do aplicativo:

    • managedIdentityObjectId: o ID do objeto da entidade de serviço da identidade gerenciada, que você encontrou na etapa anterior.
    • serverServicePrincipalObjectId: a ID do objeto da entidade de serviço do aplicativo de servidor, que você encontrou na etapa 4.
    • appRoleId: a ID da função de aplicativo exposta pelo aplicativo de servidor, que você gerou na etapa 5 - no exemplo, a ID da função de aplicativo é 00000000-0000-0000-0000-000000000000.
    • 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 de exemplo completo

Este script de exemplo mostra como atribuir a identidade gerenciada de um aplicativo Web do Azure a uma função de 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

Atribuir um acesso de identidade gerenciado à função de aplicativo de outro aplicativo usando a CLI

  • Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, consulte Guia de início rápido para Bash no Azure Cloud Shell.

  • Se preferir executar comandos de referência da CLI localmente, instale a CLI do Azure. Se estiver a utilizar o Windows ou macOS, considere executar a CLI do Azure num contentor Docker. Para obter mais informações, consulte Como executar a CLI do Azure em um contêiner do Docker.

    • Se estiver a utilizar uma instalação local, inicie sessão no CLI do Azure ao utilizar o comando az login. Para concluir o processo de autenticação, siga os passos apresentados no seu terminal. Para outras opções de entrada, consulte Entrar com a CLI do Azure.

    • Quando solicitado, instale a extensão da CLI do Azure na primeira utilização. Para obter mais informações sobre as extensões, veja Utilizar extensões com o CLI do Azure.

    • Execute o comando az version para localizar a versão e as bibliotecas dependentes instaladas. Para atualizar para a versão mais recente, execute o comando az upgrade.

  1. Habilite a identidade gerenciada em um recurso do Azure, como máquinas virtuais do Azure.

  2. Localize o ID do objeto da entidade de serviço da identidade gerenciada.

    • Para uma identidade gerenciada atribuída pelo sistema, você pode encontrar a ID do objeto no portal do Azure na página Identidade do recurso.
    • Você também pode usar o script a seguir para localizar a ID do objeto. Você precisará da ID do recurso criado na etapa anterior, 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}"
    
    oidForMI=$(az resource show --ids $resourceIdWithManagedIdentity --query "identity.principalId" -o tsv | tr -d '[:space:]')
    echo "object id for managed identity is: $oidForMI"
    
    • 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 script a seguir para localizar a ID do objeto. Você precisará do ID de 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}"
    
    oidForMI=$(az resource show --id $userManagedIdentityResourceId --query "properties.principalId" -o tsv | tr -d '[:space:]')
    echo "object id for managed identity is: $oidForMI"
    
  3. Crie um novo registro de aplicativo para representar o serviço para o qual sua identidade gerenciada envia uma solicitação.

    • Se a API ou o serviço que expõe a concessão de função do aplicativo à identidade gerenciada já tiver uma entidade de serviço em seu locatário do Microsoft Entra, ignore esta etapa.
  4. Localize a ID do objeto da entidade de serviço do aplicativo de serviço. Você pode encontrar isso usando o portal do Azure.

    • Vá para Microsoft Entra ID e abra a página de aplicativos corporativos, em seguida, localize o aplicativo e procure o ID do objeto.
    • Você também pode encontrar o ID de objeto da entidade de serviço por seu nome de exibição usando o seguinte script:
    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"
    

    Nota

    Os nomes de exibição para aplicativos não são exclusivos, portanto, você deve verificar se obtém a entidade de serviço do aplicativo correta.

    Ou você pode encontrar o ID do objeto pelo ID do aplicativo exclusivo para o registro do seu aplicativo:

    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. Adicione uma função de aplicativo ao aplicativo que você criou na etapa anterior. Você pode criar a função usando o portal do Azure ou usando o Microsoft Graph. Por exemplo, você pode adicionar uma função de aplicativo como esta:

    {
        "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. Atribua a função do aplicativo à identidade gerenciada. Você precisará das seguintes informações para atribuir a função do aplicativo:

    • managedIdentityObjectId: o 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 de servidor, que você encontrou na etapa 4.
    • appRoleId: a ID da função de aplicativo exposta pelo aplicativo de servidor, que você gerou na etapa 5 - no exemplo, a ID da função de aplicativo é 00000000-0000-0000-0000-000000000000.
  7. Execute o script a seguir para adicionar a atribuição de função. Essa funcionalidade não é exposta diretamente na CLI do Azure e um comando REST é usado aqui:

    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\"}"
    

Próximos passos