Självstudie: Få åtkomst till Microsoft Graph från en skyddad app som användare
Lär dig hur du kommer åt Microsoft Graph från en webbapp som körs i Azure App Service.
Du vill lägga till åtkomst till Microsoft Graph från din webbapp och utföra en åtgärd som den inloggade användaren. I det här avsnittet beskrivs hur du beviljar delegerade behörigheter till webbappen och hämtar den inloggade användarens profilinformation från Microsoft Entra-ID.
I den här självstudien lär du dig att:
- Bevilja delegerade behörigheter till en webbapp.
- Anropa Microsoft Graph från en webbapp för en inloggad användare.
Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt Azure-konto innan du börjar.
Förutsättningar
- Ett webbprogram som körs på Azure App Service som har modulen autentisering/auktorisering för App Service aktiverad.
Bevilja åtkomst till klientdelen för att anropa Microsoft Graph
Nu när du har aktiverat autentisering och auktorisering i webbappen registreras webbappen med Microsofts identitetsplattform och backas upp av ett Microsoft Entra-program. I det här steget ger du webbappen behörighet att komma åt Microsoft Graph för användaren. (Tekniskt sett ger du webbappens Microsoft Entra-program behörighet att komma åt Microsoft Graph Microsoft Entra-programmet för användaren.)
På menyn i administrationscentret för Microsoft Entra väljer du Program.
Välj Appregistreringar> Ägda program>Visa alla program i den här katalogen. Välj webbappens namn och välj sedan API-behörigheter.
Välj Lägg till en behörighet och välj sedan Microsoft API:er och Microsoft Graph.
Välj Delegerade behörigheter och välj sedan User.Read i listan. Välj Lägg till behörigheter.
Konfigurera App Service för att returnera en användbar åtkomsttoken
Webbappen har nu de behörigheter som krävs för att komma åt Microsoft Graph som den inloggade användaren. I det här steget konfigurerar du App Service-autentisering och auktorisering så att du får en användbar åtkomsttoken för åtkomst till Microsoft Graph. För det här steget måste du lägga till User.Read-omfånget för den underordnade tjänsten (Microsoft Graph): https://graph.microsoft.com/User.Read
.
Viktigt!
Om du inte konfigurerar App Service för att returnera en användbar åtkomsttoken får du ett CompactToken parsing failed with error code: 80049217
felmeddelande när du anropar Microsoft Graph-API:er i koden.
Gå till Azure Resource Explorer och leta upp webbappen med hjälp av resursträdet. Resurs-URL:en bör likna https://resources.azure.com/subscriptions/subscriptionId/resourceGroups/SecureWebApp/providers/Microsoft.Web/sites/SecureWebApp20200915115914
.
Azure Resource Explorer har nu öppnats med webbappen vald i resursträdet. Längst upp på sidan väljer du Läs/Skriv för att aktivera redigering av dina Azure-resurser.
I den vänstra webbläsaren går du nedåt till config>authsettingsV2.
I vyn authsettingsV2 väljer du Redigera. Leta reda på inloggningsavsnittet i identityProviders ->azureActiveDirectory och lägg till följande inställningar för loginParameters: "loginParameters":[ "response_type=code id_token","scope=openid offline_access profile https://graph.microsoft.com/User.Read" ]
.
"identityProviders": {
"azureActiveDirectory": {
"enabled": true,
"login": {
"loginParameters":[
"response_type=code id_token",
"scope=openid offline_access profile https://graph.microsoft.com/User.Read"
]
}
}
}
},
Spara inställningarna genom att välja PUT. Den här inställningen kan ta flera minuter att börja gälla. Webbappen är nu konfigurerad för åtkomst till Microsoft Graph med en korrekt åtkomsttoken. Om du inte gör det returnerar Microsoft Graph ett fel som säger att formatet för den kompakta token är felaktigt.
Anropa Microsoft Graph
Webbappen har nu de behörigheter som krävs och lägger även till Microsoft Graphs klient-ID i inloggningsparametrarna.
Med hjälp av Microsoft.Identity.Web-biblioteket hämtar webbappen en åtkomsttoken för autentisering med Microsoft Graph. I version 1.2.0 och senare integreras Microsoft.Identity.Web-biblioteket med och kan köras tillsammans med modulen App Service-autentisering/auktorisering. Microsoft.Identity.Web identifierar att webbappen finns i App Service och hämtar åtkomsttoken från modulen App Service-autentisering/auktorisering. Åtkomsttoken skickas sedan vidare till autentiserade begäranden med Microsoft Graph API.
Om du vill se den här koden som en del av ett exempelprogram kan du läsa exemplet på GitHub.
Kommentar
Microsoft.Identity.Web-biblioteket krävs inte i webbappen för grundläggande autentisering/auktorisering eller för att autentisera begäranden med Microsoft Graph. Det går att anropa underordnade API:er på ett säkert sätt med endast App Service-autentiserings-/auktoriseringsmodulen aktiverad.
App Service-autentiseringen/auktoriseringen är dock utformad för mer grundläggande autentiseringsscenarier. För mer komplexa scenarier (till exempel hantering av anpassade anspråk) behöver du Microsoft.Identity.Web-biblioteket eller Microsoft Authentication Library. Det finns lite mer installation och konfiguration i början, men microsoft.Identity.Web-biblioteket kan köras tillsammans med modulen App Service-autentisering/auktorisering. Senare, när webbappen behöver hantera mer komplexa scenarier, kan du inaktivera modulen autentisering/auktorisering för App Service och Microsoft.Identity.Web kommer redan att vara en del av din app.
Installera klientbibliotekspaket
Installera NuGet-paketen Microsoft.Identity.Web och Microsoft.Identity.Web.GraphServiceClient i projektet med hjälp av .NET-kommandoradsgränssnittet (CLI) eller Package Manager-konsolen i Visual Studio.
.NET CLI
Öppna en kommandorad och växla till katalogen som innehåller projektfilen.
Kör installationskommandona.
dotnet add package Microsoft.Identity.Web.GraphServiceClient
dotnet add package Microsoft.Identity.Web
Package Manager-konsol
Öppna projektet/lösningen i Visual Studio och öppna konsolen med hjälp av kommandot Verktyg>NuGet Package Manager>Package Manager Console.
Kör installationskommandona.
Install-Package Microsoft.Identity.Web.GraphServiceClient
Install-Package Microsoft.Identity.Web
Startup.cs
I filen Startup.cs lägger metoden till Microsoft.Identity.Web i webbappen AddMicrosoftIdentityWebApp
. Metoden AddMicrosoftGraph
lägger till Microsoft Graph-stöd.
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Identity.Web;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
// Some code omitted for brevity.
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
string[] initialScopes = Configuration.GetValue<string>("DownstreamApi:Scopes")?.Split(' ');
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
.AddMicrosoftGraph(Configuration.GetSection("DownstreamApi"))
.AddInMemoryTokenCaches();
services.AddAuthorization(options =>
{
// By default, all incoming requests will be authorized according to the default policy
options.FallbackPolicy = options.DefaultPolicy;
});
services.AddRazorPages()
.AddMvcOptions(options => {})
.AddMicrosoftIdentityUI();
services.AddControllersWithViews()
.AddMicrosoftIdentityUI();
}
}
appsettings.json
Microsoft Entra-ID anger konfigurationen för Microsoft.Identity.Web-biblioteket. I administrationscentret för Microsoft Entra väljer du Program på portalmenyn och väljer sedan Appregistreringar. Välj den appregistrering som skapades när du aktiverade App Service-autentiserings-/auktoriseringsmodulen. (Appregistreringen bör ha samma namn som din webbapp.) Du hittar klientorganisations-ID:t och klient-ID:t på översiktssidan för appregistrering. Domännamnet finns på översiktssidan för Microsoft Entra för din klientorganisation.
Graph anger Microsoft Graph-slutpunkten och de initiala omfång som krävs av appen.
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "[Enter the domain of your tenant, e.g. contoso.onmicrosoft.com]",
"TenantId": "[Enter 'common', or 'organizations' or the Tenant Id (Obtained from the Entra admin center. Select 'Endpoints' from the 'App registrations' blade and use the GUID in any of the URLs), e.g. aaaabbbb-0000-cccc-1111-dddd2222eeee]",
"ClientId": "[Enter the Client Id (Application ID obtained from the Microsoft Entra admin center), e.g. 00001111-aaaa-2222-bbbb-3333cccc4444]",
"ClientSecret": "[Copy the client secret added to the app from the Microsoft Entra admin center]",
"ClientCertificates": [
],
// the following is required to handle Continuous Access Evaluation challenges
"ClientCapabilities": [ "cp1" ],
"CallbackPath": "/signin-oidc"
},
"DownstreamApis": {
"MicrosoftGraph": {
// Specify BaseUrl if you want to use Microsoft graph in a national cloud.
// See https://learn.microsoft.com/graph/deployments#microsoft-graph-and-graph-explorer-service-root-endpoints
// "BaseUrl": "https://graph.microsoft.com/v1.0",
// Set RequestAppToken this to "true" if you want to request an application token (to call graph on
// behalf of the application). The scopes will then automatically
// be ['https://graph.microsoft.com/.default'].
// "RequestAppToken": false
// Set Scopes to request (unless you request an app token).
"Scopes": [ "User.Read" ]
// See https://aka.ms/ms-id-web/downstreamApiOptions for all the properties you can set.
}
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Index.cshtml.cs
I följande exempel visas hur du anropar Microsoft Graph som den inloggade användaren och hämtar viss användarinformation. Objektet GraphServiceClient
matas in i kontrollanten och autentiseringen har konfigurerats åt dig av Microsoft.Identity.Web-biblioteket.
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Graph;
using System.IO;
using Microsoft.Identity.Web;
using Microsoft.Extensions.Logging;
// Some code omitted for brevity.
[AuthorizeForScopes(Scopes = new[] { "User.Read" })]
public class IndexModel : PageModel
{
private readonly ILogger<IndexModel> _logger;
private readonly GraphServiceClient _graphServiceClient;
public IndexModel(ILogger<IndexModel> logger, GraphServiceClient graphServiceClient)
{
_logger = logger;
_graphServiceClient = graphServiceClient;
}
public async Task OnGetAsync()
{
try
{
var user = await _graphServiceClient.Me.GetAsync();
ViewData["Me"] = user;
ViewData["name"] = user.DisplayName;
using (var photoStream = await _graphServiceClient.Me.Photo.Content.GetAsync())
{
byte[] photoByte = ((MemoryStream)photoStream).ToArray();
ViewData["photo"] = Convert.ToBase64String(photoByte);
}
}
catch (Exception ex)
{
ViewData["photo"] = null;
}
}
}
Rensa resurser
Om du är klar med den här självstudien och inte längre behöver webbappen eller associerade resurser rensar du de resurser som du skapade.