Tilldela en hanterad identitet åtkomst till en programroll med hjälp av PowerShell

Hanterade identiteter för Azure-resurser tillhandahåller Azure-tjänster med en identitet i Microsoft Entra-ID. De fungerar utan att behöva autentiseringsuppgifter i koden. Azure-tjänster använder den här identiteten för att autentisera till tjänster som stöder Microsoft Entra-autentisering. Programroller ger en form av rollbaserad åtkomstkontroll och tillåter att en tjänst implementerar auktoriseringsregler.

Kommentar

De token som ditt program tar emot cachelagras av den underliggande infrastrukturen, vilket innebär att alla ändringar i den hanterade identitetens roller kan ta betydande tid att börja gälla. Mer information finns i Begränsning av att använda hanterade identiteter för auktorisering.

I den här artikeln får du lära dig hur du tilldelar en hanterad identitet till en programroll som exponeras av ett annat program med hjälp av Microsoft Graph PowerShell SDK.

Förutsättningar

Tilldela en hanterad identitet åtkomst till ett annat programs approll

  1. Aktivera hanterad identitet på en Azure-resurs, till exempel en virtuell Azure-dator.

  2. Hitta objekt-ID:t för den hanterade identitetens tjänsthuvudnamn.

    För en systemtilldelad hanterad identitet hittar du objekt-ID:t på Azure-portalen på resursens identitetssida. Du kan också använda följande PowerShell-skript för att hitta objekt-ID:t. Du behöver resurs-ID:t för den resurs som du skapade i steg 1, som finns i Azure-portalen på resursens egenskapssida.

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

    För en användartilldelad hanterad identitet hittar du den hanterade identitetens objekt-ID på Azure-portalen på resursens översiktssida. Du kan också använda följande PowerShell-skript för att hitta objekt-ID:t. Du behöver resurs-ID för den användartilldelade hanterade identiteten.

    $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. Skapa en ny programregistrering som representerar den tjänst som din hanterade identitet skickar en begäran till. Om det API eller den tjänst som exponerar approllen som beviljas till den hanterade identiteten redan har ett huvudnamn för tjänsten i din Microsoft Entra-klientorganisation hoppar du över det här steget. Om du till exempel vill ge den hanterade identiteten åtkomst till Microsoft Graph API kan du hoppa över det här steget.

  4. Hitta objekt-ID:t för tjänstprogrammets tjänsthuvudnamn. Du hittar detta med hjälp av Azure-portalen. Gå till Microsoft Entra-ID och öppna sidan Företagsprogram, leta upp programmet och leta efter objekt-ID: t. Du kan också hitta tjänstens huvudnamns objekt-ID med dess visningsnamn med hjälp av följande PowerShell-skript:

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

    Kommentar

    Visningsnamn för program är inte unika, så du bör kontrollera att du har rätt programtjänsthuvudnamn.

  5. Lägg till en approll i programmet som du skapade i steg 3. Du kan skapa rollen med hjälp av Azure-portalen eller med hjälp av Microsoft Graph. Du kan till exempel lägga till en approll genom att köra följande fråga i 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. Tilldela approllen till den hanterade identiteten. Du behöver följande information för att tilldela approllen:

    • managedIdentityObjectId: objekt-ID för den hanterade identitetens tjänsthuvudnamn, som du hittade i steg 2.
    • serverServicePrincipalObjectId: objekt-ID för serverprogrammets tjänsthuvudnamn, som du hittade i steg 4.
    • appRoleId: ID:t för approllen som exponeras av serverappen, som du genererade i steg 5 – i exemplet är 0566419e-bb95-4d9d-a4f8-ed9a0f147fa6approllens ID .

    Kör följande PowerShell-kommando för att lägga till rolltilldelningen:

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

Fullständigt skript

Det här exempelskriptet visar hur du tilldelar en Azure-webbapps hanterade identitet till en approll.

# 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

Nästa steg