Esercitazione: Accedere a Microsoft Graph da un'app protetta come app
Informazioni su come accedere a Microsoft Graph da un'app Web in esecuzione nel Servizio app di Azure.
Si vuole chiamare Microsoft Graph per l'app Web. Un modo sicuro per concedere all'app Web l'accesso ai dati consiste nell'usare un'identità gestita assegnata dal sistema. Un'identità gestita di Microsoft Entra ID consente al servizio app di accedere alle risorse tramite il controllo degli accessi in base al ruolo, senza richiedere le credenziali dell'app. Dopo aver assegnato un'identità gestita all'app Web, Azure si occupa della creazione e della distribuzione di un certificato. Non occorre preoccuparsi di gestire i segreti o le credenziali dell'app.
In questa esercitazione apprenderai a:
- Creare un'identità gestita assegnata dal sistema in un'app Web.
- Aggiungere le autorizzazioni dell'API Microsoft Graph a un'identità gestita.
- Chiamare Microsoft Graph da un'app Web usando identità gestite.
Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.
Prerequisiti
- Un'applicazione Web in esecuzione nel Servizio app di Azure con il modulo di autenticazione/autorizzazione del servizio app abilitato.
Abilitare l'identità gestita nell'app
Se si crea e si pubblica l'app Web tramite Visual Studio, l'identità gestita è già stata abilitata automaticamente nell'app.
Nel servizio app selezionare Identità nel riquadro sinistro e quindi selezionare Assegnata dal sistema.
Verificare che lo Stato sia impostato su Sì. In caso contrario, selezionare Salva e quindi Sì per abilitare l'identità gestita assegnata dal sistema. Una volta abilitata l'identità gestita, lo stato è impostato su Sì e l'ID oggetto è disponibile.
Prendere nota del valore di ID oggetto, che sarà necessario nel passaggio successivo.
Concedere l'accesso a Microsoft Graph
Quando si accede a Microsoft Graph, l'identità gestita deve disporre delle autorizzazioni appropriate per l'operazione da eseguire. Attualmente, non è possibile assegnare tali autorizzazioni tramite l'interfaccia di amministrazione di Microsoft Entra.
Eseguire lo script seguente per aggiungere le autorizzazioni dell'API Microsoft Graph necessarie all'oggetto entità servizio dell'identità gestita.
# Install the module. # Install-Module Microsoft.Graph -Scope CurrentUser # The tenant ID $TenantId = "aaaabbbb-0000-cccc-1111-dddd2222eeee" # The name of your web app, which has a managed identity. $webAppName = "SecureWebApp-20201106120003" $resourceGroupName = "SecureWebApp-20201106120003ResourceGroup" # The name of the app role that the managed identity should be assigned to. $appRoleName = "User.Read.All" # Get the web app's managed identity's object ID. Connect-AzAccount -Tenant $TenantId $managedIdentityObjectId = (Get-AzWebApp -ResourceGroupName $resourceGroupName -Name $webAppName).identity.principalid Connect-MgGraph -TenantId $TenantId -Scopes 'Application.Read.All','AppRoleAssignment.ReadWrite.All' # Get Microsoft Graph app's service principal and app role. $serverApplicationName = "Microsoft Graph" $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 $managedIdentityObjectId ` -PrincipalId $managedIdentityObjectId ` -ResourceId $serverServicePrincipalObjectId ` -AppRoleId $appRoleId
Dopo aver eseguito lo script, è possibile verificare nell’interfaccia di amministrazione di Microsoft Entra che le autorizzazioni API necessarie siano assegnate all'identità gestita.
Passare a Applicazioni e quindi selezionare Applicazioni aziendali. Questo riquadro mostra tutte le entità servizio presenti nel tenant. Aggiungere un filtro per "Tipo di applicazione==Identità gestite" e selezionare l'entità servizio per l'identità gestita.
Se si segue questa esercitazione, sono disponibili due entità servizio con lo stesso nome visualizzato, ad esempio SecureWebApp2020094113531. L'entità servizio con URL della home page rappresenta l'app Web nel tenant. L'entità servizio visualizzata in Identità gestite non deve avere un URL della home page elencato e l'ID oggetto deve corrispondere al valore ID oggetto dell'identità gestita nel passaggio precedente.
Selezionare l'entità servizio per l'identità gestita.
In Panoramica selezionare Autorizzazioni per visualizzare le autorizzazioni aggiunte per Microsoft Graph.
Chiamare Microsoft Graph
Le classi ChainedTokenCredential, ManagedIdentityCredential e EnvironmentCredential vengono usate per ottenere credenziali di token per il codice per autorizzare le richieste a Microsoft Graph. Creare un'istanza della classe ChainedTokenCredential, che usa l'identità gestita nell'ambiente del servizio app o le variabili di ambiente di sviluppo per recuperare i token e collegarli al client del servizio. L'esempio di codice seguente ottiene le credenziali del token autenticato e le usa per creare un oggetto client del servizio, che recupera gli utenti nel gruppo.
Per visualizzare questo codice come parte di un'applicazione di esempio, vedere:
Installare il pacchetto della libreria client Microsoft.Identity.Web.MicrosoftGraph
Installare il pacchetto NuGet Microsoft.Identity.Web.MicrosoftGraph nel progetto usando l'interfaccia della riga di comando di .NET Core o la console Gestione pacchetti in Visual Studio.
Riga di comando di .NET Core
Aprire una riga di comando e passare alla directory che contiene il file di progetto.
Eseguire i comandi di installazione.
dotnet add package Microsoft.Identity.Web.MicrosoftGraph
dotnet add package Microsoft.Graph
Console di gestione pacchetti
Aprire il progetto o la soluzione in Visual Studio, quindi aprire la console selezionando Strumenti>Gestione pacchetti NuGet>Console di Gestione pacchetti.
Eseguire i comandi di installazione.
Install-Package Microsoft.Identity.Web.MicrosoftGraph
Install-Package Microsoft.Graph
Esempio .NET
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using Microsoft.Graph;
using Azure.Identity;
...
public IList<MSGraphUser> Users { get; set; }
public async Task OnGetAsync()
{
// Create the Graph service client with a ChainedTokenCredential which gets an access
// token using the available Managed Identity or environment variables if running
// in development.
var credential = new ChainedTokenCredential(
new ManagedIdentityCredential(),
new EnvironmentCredential());
string[] scopes = new[] { "https://graph.microsoft.com/.default" };
var graphServiceClient = new GraphServiceClient(
credential, scopes);
List<MSGraphUser> msGraphUsers = new List<MSGraphUser>();
try
{
//var users = await graphServiceClient.Users.Request().GetAsync();
var users = await graphServiceClient.Users.GetAsync();
foreach (var u in users.Value)
{
MSGraphUser user = new MSGraphUser();
user.userPrincipalName = u.UserPrincipalName;
user.displayName = u.DisplayName;
user.mail = u.Mail;
user.jobTitle = u.JobTitle;
msGraphUsers.Add(user);
}
}
catch (Exception ex)
{
string msg = ex.Message;
}
Users = msGraphUsers;
}
Pulire le risorse
Se l'esercitazione è stata completata e l'app Web o le risorse associate non sono più necessarie, pulire le risorse create.
Eliminare il gruppo di risorse
Nel portale di Azure selezionare Gruppi di risorse dal menu del portale e selezionare il gruppo di risorse contenente il servizio app e il piano di servizio app.
Fare clic su Elimina gruppo di risorse per eliminare il gruppo e tutte le risorse al suo interno.
L'esecuzione di questo comando potrebbe richiedere diversi minuti.
Passaggi successivi
Questa esercitazione ha descritto come:
- Creare un'identità gestita assegnata dal sistema in un'app Web.
- Aggiungere le autorizzazioni dell'API Microsoft Graph a un'identità gestita.
- Chiamare Microsoft Graph da un'app Web usando identità gestite.
Informazioni su come connettere un'app .NET Core, un'app Python, un'app Java o un'app Node.js a un database.