Concedere il consenso per conto di un singolo utente tramite PowerShell

Questo articolo illustra come concedere il consenso per conto di un singolo utente tramite PowerShell.

Quando un utente concede il consenso per se stesso, gli eventi seguenti si verificano più spesso:

  1. Viene creata un'entità servizio per l'applicazione client, se non esiste già. Un'entità servizio è l'istanza di un'applicazione o un servizio nel tenant di Microsoft Entra. L'accesso concesso all'app o al servizio è associato a questo oggetto entità servizio.

  2. Per ogni API a cui l'applicazione richiede l'accesso, viene creata una concessione di autorizzazione delegata a tale API per le autorizzazioni necessarie per l'applicazione. L'accesso viene concesso per conto dell'utente. Una concessione di autorizzazione delegata autorizza un'applicazione ad accedere a un'API per conto di un utente, quando tale utente accede.

  3. All'utente viene assegnata l'applicazione client. L'assegnazione dell'applicazione all'utente garantisce che l'applicazione sia elencata nel portale App personali per tale utente. L'utente può esaminare e revocare l'accesso concesso per suo conto dal portale App personali.

Prerequisiti

Per concedere il consenso a un'applicazione per conto di un utente, è necessario:

  • Un account utente con un amministratore ruolo con privilegi, un amministratore applicazione o un amministratore applicazione cloud

Prima di iniziare, registrare i dettagli seguenti dall'interfaccia di amministrazione di Microsoft Entra:

  • ID app per l'app a cui si sta concedendo il consenso. Ai fini di questo articolo, viene chiamata applicazione client.
  • Autorizzazioni API richieste dall'applicazione client. Individuare l'ID app dell'API e gli ID autorizzazione o i valori delle attestazioni.
  • Nome utente o ID oggetto dell'utente per conto del quale viene concesso l'accesso.

Per questo esempio si usa Microsoft Graph PowerShell per concedere il consenso per conto di un singolo utente. L'applicazione client è Microsoft Graph Explorere viene concesso l'accesso all'API Microsoft Graph.

Per concedere il consenso a un'applicazione per conto di un utente che usa Microsoft Graph PowerShell, è necessario accedere almeno come amministratore applicazione cloud.

# The app for which consent is being granted. In this example, we're granting access
# to Microsoft Graph Explorer, an application published by Microsoft.
$clientAppId = "de8bc8b5-d9f9-48b1-a8ad-b748da725064" # Microsoft Graph Explorer

# The API to which access will be granted. Microsoft Graph Explorer makes API 
# requests to the Microsoft Graph API, so we'll use that here.
$resourceAppId = "00000003-0000-0000-c000-000000000000" # Microsoft Graph API

# The permissions to grant. Here we're including "openid", "profile", "User.Read"
# and "offline_access" (for basic sign-in), as well as "User.ReadBasic.All" (for 
# reading other users' basic profile).
$permissions = @("openid", "profile", "offline_access", "User.Read", "User.ReadBasic.All")

# The user on behalf of whom access will be granted. The app will be able to access 
# the API on behalf of this user.
$userUpnOrId = "user@example.com"

# Step 0. Connect to Microsoft Graph PowerShell. We need User.ReadBasic.All to get
#    users' IDs, Application.ReadWrite.All to list and create service principals, 
#    DelegatedPermissionGrant.ReadWrite.All to create delegated permission grants, 
#    and AppRoleAssignment.ReadWrite.All to assign an app role.
#    WARNING: These are high-privilege permissions!
Connect-MgGraph -Scopes ("User.ReadBasic.All Application.ReadWrite.All " `
                        + "DelegatedPermissionGrant.ReadWrite.All " `
                        + "AppRoleAssignment.ReadWrite.All")

# Step 1. Check if a service principal exists for the client application. 
#     If one doesn't exist, create it.
$clientSp = Get-MgServicePrincipal -Filter "appId eq '$($clientAppId)'"
if (-not $clientSp) {
   $clientSp = New-MgServicePrincipal -AppId $clientAppId
}

# Step 2. Create a delegated permission that grants the client app access to the
#     API, on behalf of the user. (This example assumes that an existing delegated 
#     permission grant does not already exist, in which case it would be necessary 
#     to update the existing grant, rather than create a new one.)
$user = Get-MgUser -UserId $userUpnOrId
$resourceSp = Get-MgServicePrincipal -Filter "appId eq '$($resourceAppId)'"
$scopeToGrant = $permissions -join " "
$grant = New-MgOauth2PermissionGrant -ResourceId $resourceSp.Id `
                                     -Scope $scopeToGrant `
                                     -ClientId $clientSp.Id `
                                     -ConsentType "Principal" `
                                     -PrincipalId $user.Id

# Step 3. Assign the app to the user. This ensures that the user can sign in if assignment
#     is required, and ensures that the app shows up under the user's My Apps portal.
if ($clientSp.AppRoles | ? { $_.AllowedMemberTypes -contains "User" }) {
    Write-Warning ("A default app role assignment cannot be created because the " `
                 + "client application exposes user-assignable app roles. You must " `
                 + "assign the user a specific app role for the app to be listed " `
                 + "in the user's My Apps portal.")
} else {
    # The app role ID 00000000-0000-0000-0000-000000000000 is the default app role
    # indicating that the app is assigned to the user, but not for any specific 
    # app role.
    $assignment = New-MgServicePrincipalAppRoleAssignedTo `
          -ServicePrincipalId $clientSp.Id `
          -ResourceId $clientSp.Id `
          -PrincipalId $user.Id `
          -AppRoleId "00000000-0000-0000-0000-000000000000"
}

Per concedere il consenso a un'applicazione per conto di un utente che usa l'API Microsoft Graph, accedere a Graph Explorer almeno come amministratore applicazione cloud.

È necessario fornire il consenso alle autorizzazioni seguenti:

Application.ReadWrite.All, Directory.ReadWrite.All, DelegatedPermissionGrant.ReadWrite.All.

Nell'esempio seguente si concedono autorizzazioni delegate definite da un'API di risorsa a un'applicazione aziendale client per conto di un singolo utente.

Nell'esempio l'applicazione aziendale delle risorse è Microsoft Graph con ID oggetto 11112222-bbbb-3333-cccc-4444dddd5555. Microsoft Graph definisce le autorizzazioni delegate, User.Read.All e Group.Read.All. ConsentType è Principal, che indica che si sta acconsentendo per conto di un singolo utente nel tenant. L'ID oggetto dell'applicazione aziendale client è 00001111-aaaa-2222-bbbb-3333cccc4444. PrincipalId dell'utente è aaaaaaaa-bbbb-cccc-1111-222222222222.

Attenzione

Fare attenzione. Le autorizzazioni concesse a livello di codice non sono soggette a revisione o conferma. Diventano effettive immediatamente.

  1. Recuperare tutte le autorizzazioni delegate definite da Microsoft Graph (l'applicazione della risorsa) nell'applicazione tenant. Identificare le autorizzazioni delegate che si desidera concedere all'applicazione client. In questo esempio le autorizzazioni di delega sono User.Read.All e Group.Read.All

    GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=displayName eq 'Microsoft Graph'&$select=id,displayName,appId,oauth2PermissionScopes
    
  2. Concedere le autorizzazioni delegate all'applicazione aziendale client per conto dell'utente eseguendo la richiesta seguente.

    POST https://graph.microsoft.com/v1.0/oauth2PermissionGrants
    
    Request body
    {
       "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
       "consentType": "Principal",
       "resourceId": "11112222-bbbb-3333-cccc-4444dddd5555",
       "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
       "scope": "User.Read.All Group.Read.All"
    }
    
  3. Verificare di aver concesso il consenso all'utente eseguendo la richiesta seguente.

    GET https://graph.microsoft.com/v1.0/oauth2PermissionGrants?$filter=clientId eq '00001111-aaaa-2222-bbbb-3333cccc4444' and consentType eq 'Principal'
    
  4. Assegnare l'app all'utente. Questa assegnazione garantisce che l'utente possa accedere se l'assegnazione è necessaria e assicura che l'app sia disponibile tramite il portale App personali dell'utente. Nell'esempio seguente resourceIdrappresenta l'app client a cui viene assegnato l'utente. All'utente viene assegnato il ruolo app predefinito che è 00000000-0000-0000-0000-000000000000.

        POST /servicePrincipals/resource-servicePrincipal-id/appRoleAssignedTo
    
        {
        "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
        "resourceId": "a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1",
        "appRoleId": "00000000-0000-0000-0000-000000000000"
        }
    

Passaggi successivi