Asignación de acceso de identidad administrada a un rol de aplicación mediante PowerShell

Las identidades administradas de los recursos de Azure proporcionan a los servicios de Azure una identidad en Microsoft Entra ID. Funcionan sin necesidad de usar credenciales en el código. Los servicios de Azure usan esta identidad para autenticarse en servicios compatibles con la autenticación de Microsoft Entra. Los roles de aplicación ofrecen una forma de control de acceso basado en roles y permiten que un servicio implemente reglas de autorización.

Nota

Los tokens que recibe la aplicación se almacenan en caché en la infraestructura subyacente, lo que significa que cualquier cambio en los roles de la identidad administrada puede tardar mucho tiempo en tener efecto. Para más información, vea Limitación del uso de identidades administradas para la autorización.

En este artículo, aprenderá a asignar una identidad administrada a un rol de aplicación mostrado por otra aplicación mediante el SDK de PowerShell de Microsoft Graph.

Requisitos previos

Asignación de acceso de identidad administrada al rol de aplicación de otra aplicación

  1. Habilite la identidad administrada en un recurso de Azure, como una máquina virtual de Azure.

  2. Busque el identificador de objeto de la entidad de servicio de la identidad administrada.

    En el caso de una identidad administrada asignada por el sistema, encontrará el identificador de objeto en la página de identidad del recurso en Azure Portal. También puede usar el siguiente script de PowerShell para buscar el identificador de objeto. Necesitará el identificador del recurso que creó en el paso 1, que está disponible en la página Propiedades del recurso en Azure Portal.

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

    En el caso de una identidad administrada asignada por el usuario, encontrará el identificador de objeto de la identidad administrada en la página de información general del recurso en Azure Portal. También puede usar el siguiente script de PowerShell para buscar el identificador de objeto. Necesitará el identificador del recurso de la identidad administrada asignada por el usuario.

    $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. Cree un nuevo registro de aplicación que represente el servicio al que la identidad administrada enviará una solicitud. Omita este paso si la API o el servicio que muestran la concesión de rol de aplicación a la identidad administrada ya tiene una entidad de servicio en el inquilino de Microsoft Entra. Por ejemplo, si desea conceder el acceso de identidad administrada a Microsoft Graph API, puede omitir el paso.

  4. Busque el identificador de objeto de la entidad de servicio de la aplicación de servicio. Puede encontrarlo en Azure Portal. Vaya a Microsoft Entra ID y abra la página Aplicaciones empresariales. A continuación, busque la aplicación y el identificador de objeto. También puede buscar el identificador de objeto de la entidad de servicio por su nombre para mostrar. Para ello, use el siguiente script de PowerShell:

    $serverServicePrincipalObjectId = (Get-MgServicePrincipal -Filter "DisplayName eq '$applicationName'").Id
    

    Nota:

    Los nombres para mostrar de las aplicaciones no son únicos, por lo que debe comprobar que obtiene la entidad de servicio de la aplicación correcta.

  5. Agregue un rol de aplicación a la aplicación que creó en el paso 3. Puede crear el rol mediante Azure Portal o Microsoft Graph. Por ejemplo, puede agregar un rol de aplicación mediante la ejecución de la siguiente consulta en el Probador de 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. Asigne el rol de aplicación a la identidad administrada. Para asignar el rol de aplicación, necesitará la siguiente información:

    • managedIdentityObjectId: el identificador de objeto de la entidad de servicio de la identidad administrada, que encontró en el paso 2.
    • serverServicePrincipalObjectId: el identificador de objeto de la entidad de servicio de la aplicación de servidor, que encontró en el paso 4.
    • appRoleId: el identificador del rol de aplicación mostrado por la aplicación de servidor, que se generó en el paso 5; en el ejemplo, el identificador del rol de aplicación es 0566419e-bb95-4d9d-a4f8-ed9a0f147fa6.

    Ejecute el siguiente comando de PowerShell para agregar la asignación de roles:

    New-MgServicePrincipalAppRoleAssignment `
        -ServicePrincipalId $serverServicePrincipalObjectId `
        -PrincipalId $managedIdentityObjectId `
        -ResourceId $serverServicePrincipalObjectId `
        -AppRoleId $appRoleId
    

Completar script

Este script de ejemplo muestra cómo asignar una identidad administrada de una aplicación web de Azure a un rol de aplicación.

# 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

Pasos siguientes