Assegnare a un'identità gestita l'accesso a un ruolo dell'applicazione

Le identità gestite per le risorse di Azure offrono ai servizi di Azure un'identità in Microsoft Entra ID. Non richiedono di incorporare le credenziali nel codice. I servizi di Azure usano questa identità per eseguire l'autenticazione ai servizi che supportano l'autenticazione di Microsoft Entra. I ruoli dell'applicazione forniscono una forma di controllo degli accessi in base al ruolo e consentono a un servizio di implementare le regole di autorizzazione.

Nota

I token ricevuti dall'applicazione vengono memorizzati nella cache dall'infrastruttura sottostante. Ciò significa che le modifiche apportate ai ruoli dell'identità gestita possono richiedere tempi di elaborazione prolungati. Per altre informazioni, vedere Limitazione dell'uso di identità gestite per l'autorizzazione.

Questo articolo illustra come assegnare un'identità gestita a un ruolo dell'applicazione esposto da un'altra applicazione usando Microsoft Graph PowerShell SDK.

Prerequisiti

Assegnare a un'identità gestita l'accesso al ruolo app di un'altra applicazione tramite PowerShell

Per eseguire gli script di esempio, sono disponibili due opzioni:

  1. Abilitare l'identità gestita in una risorsa di Azure, ad esempio una macchina virtuale di Azure.

  2. Trovare l'ID oggetto dell'entità servizio dell'identità gestita.

    Per un'identità gestita assegnata dal sistema, è possibile trovare l'ID oggetto nel portale di Azure nella pagina Identità della risorsa. È anche possibile usare lo script di PowerShell seguente per trovare l'ID oggetto. Sarà necessario l'ID della risorsa creata nel passaggio 1, disponibile nel portale di Azure nella pagina Proprietà della risorsa.

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

    Per un'identità gestita assegnata dall'utente, è possibile trovare l'ID oggetto dell'identità gestita nel portale di Azure nella pagina Panoramica della risorsa. È anche possibile usare lo script di PowerShell seguente per trovare l'ID oggetto. Sarà necessario l'ID risorsa dell'identità gestita assegnata dall'utente.

    $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. Creare una nuova registrazione dell'applicazione per rappresentare il servizio a cui l'identità gestita dovrà inviare una richiesta.

    • Se l'API o il servizio che espone la concessione del ruolo app all'identità gestita ha già un'entità servizio nel tenant di Microsoft Entra, ignorare questo passaggio. Ad esempio, se si vuole concedere all'identità gestita l'accesso all'API Microsoft Graph.
  4. Trovare l'ID oggetto dell'entità servizio dell'applicazione del servizio. Tale ID è reperibile nel portale di Azure.

    • Ad esempio, passare a Microsoft Entra ID e aprire la pagina Applicazioni aziendali. Trovare quindi l'applicazione e cercare l'ID oggetto.
    • È anche possibile trovare l'ID oggetto dell'entità servizio in base al nome visualizzato usando lo script di PowerShell seguente:
    $serverServicePrincipalObjectId = (Get-MgServicePrincipal -Filter "DisplayName eq '$applicationName'").Id
    

    Nota

    I nomi visualizzati per le applicazioni non sono univoci, quindi è necessario assicurarsi di ottenere l'entità servizio dell'applicazione corretta.

  5. Aggiungere un ruolo dell'app all'applicazione creata nel passaggio precedente. È quindi possibile creare il ruolo usando il portale di Azure o Microsoft Graph.

    • Ad esempio, è possibile aggiungere un ruolo dell'app eseguendo la query seguente in 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. Assegnare il ruolo dell'app all'identità gestita. Per assegnare il ruolo, sono necessarie le informazioni seguenti:

    • managedIdentityObjectId: ID oggetto dell'entità servizio dell'identità gestita, trovato nel passaggio precedente.
    • serverServicePrincipalObjectId: ID oggetto dell'entità servizio dell'applicazione server, trovato nel passaggio 4.
    • appRoleId: ID del ruolo dell'app esposto dall'app server, generato nel passaggio 5. Nell'esempio, l'ID ruolo dell'app è 00000000-0000-0000-0000-000000000000.
    • Eseguire il comando di PowerShell seguente per aggiungere l'assegnazione di ruolo:
    New-MgServicePrincipalAppRoleAssignment `
        -ServicePrincipalId $serverServicePrincipalObjectId `
        -PrincipalId $managedIdentityObjectId `
        -ResourceId $serverServicePrincipalObjectId `
        -AppRoleId $appRoleId
    

Script di esempio completo

Questo script di esempio illustra come assegnare l'identità gestita di un'app Web di Azure a un ruolo dell'app.

# 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

Assegnare a un'identità gestita l'accesso al ruolo app di un'altra applicazione tramite l'interfaccia della riga di comando

  1. Abilitare l'identità gestita in una risorsa di Azure, ad esempio una macchina virtuale di Azure.

  2. Trovare l'ID oggetto dell'entità servizio dell'identità gestita.

    • Per un'identità gestita assegnata dal sistema, è possibile trovare l'ID oggetto nel portale di Azure nella pagina Identità della risorsa.
    • È anche possibile usare lo script seguente per trovare l'ID oggetto. Sarà necessario l'ID della risorsa creata nel passaggio precedente, disponibile nel portale di Azure nella pagina Proprietà della risorsa.
    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"
    
    • Per un'identità gestita assegnata dall'utente, è possibile trovare l'ID oggetto dell'identità gestita nel portale di Azure nella pagina Panoramica della risorsa. È anche possibile usare lo script seguente per trovare l'ID oggetto. Sarà necessario l'ID risorsa dell'identità gestita assegnata dall'utente.
    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. Creare una nuova registrazione dell'applicazione per rappresentare il servizio a cui l'identità gestita invia una richiesta.

    • Se l'API o il servizio che espone la concessione del ruolo app all'identità gestita ha già un'entità servizio nel tenant di Microsoft Entra, ignorare questo passaggio.
  4. Trovare l'ID oggetto dell'entità servizio dell'applicazione del servizio. Tale ID è reperibile nel portale di Azure.

    • Passare a Microsoft Entra ID e aprire la pagina Applicazioni aziendali, quindi individuare l'applicazione e cercare l'ID oggetto.
    • È anche possibile trovare l'ID oggetto dell'entità servizio in base al nome visualizzato usando lo script seguente:
    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

    I nomi visualizzati per le applicazioni non sono univoci, quindi è necessario assicurarsi di ottenere l'entità servizio dell'applicazione corretta.

    In alternativa, è possibile trovare l'ID oggetto in base all'ID applicazione univoco per la registrazione dell'applicazione:

    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. Aggiungere un ruolo dell'app all'applicazione creata nel passaggio precedente. È possibile creare il ruolo usando il portale di Azure o Microsoft Graph. Ad esempio, è possibile aggiungere un ruolo dell'app nel modo seguente:

    {
        "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. Assegnare il ruolo dell'app all'identità gestita. Per assegnare il ruolo, sono necessarie le informazioni seguenti:

    • managedIdentityObjectId: ID oggetto dell'entità servizio dell'identità gestita, trovato nel passaggio 2.
    • serverServicePrincipalObjectId: ID oggetto dell'entità servizio dell'applicazione server, trovato nel passaggio 4.
    • appRoleId: ID del ruolo dell'app esposto dall'app server, generato nel passaggio 5. Nell'esempio, l'ID ruolo dell'app è 00000000-0000-0000-0000-000000000000.
  7. Eseguire lo script seguente per aggiungere l'assegnazione di ruolo. Questa funzionalità non è esposta direttamente nell'interfaccia della riga di comando di Azure e in questo caso viene usato un comando 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\"}"
    

Passaggi successivi