Didacticiel : Implémenter un point de terminaison protégé pour votre API

Dans ce tutoriel, vous allez apprendre à protéger un point de terminaison d’API en ajoutant des éléments d’authentification au code source. La protection d’un point de terminaison d’API garantit que seuls les utilisateurs disposant d’une autorisation peuvent y accéder. Vous pouvez tester l’API avec une requête non authentifiée pour vous assurer que votre API limite l’accès des utilisateurs non autorisés. La plateforme d'identités Microsoft permet de protéger les points de terminaison d’API à l’aide du package NuGet Microsoft.Identity.Web. Dans cet article, vous allez :

  • Implémenter des éléments d’authentification dans le code source
  • Ajouter des informations météorologiques pour l’API à afficher
  • Tester l’API avec une requête GET non authentifiée

Prérequis

Implémenter l’autorisation

  1. Ouvrez le fichier Program.cs et remplacez le contenu par l’extrait de code suivant :

    using Microsoft.AspNetCore.Authentication.JwtBearer;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.Identity.Web;
    
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApi(options =>
            {
                builder.Configuration.Bind("AzureAd", options);
                options.TokenValidationParameters.NameClaimType = "name";
            }, options => { builder.Configuration.Bind("AzureAd", options); });
    
        builder.Services.AddAuthorization(config =>
        {
            config.AddPolicy("AuthZPolicy", policyBuilder =>
                policyBuilder.Requirements.Add(new ScopeAuthorizationRequirement() { RequiredScopesConfigurationKey = $"AzureAd:Scopes" }));
        });
    
    // Add services to the container.
    builder.Services.AddRazorPages();
    
    var app = builder.Build();
    
    app.UseAuthentication();
    app.UseAuthorization();
    
    var weatherSummaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };
    
    app.MapGet("/weatherforecast", [Authorize(Policy = "AuthZPolicy")] () =>
        {
            var forecast = Enumerable.Range(1, 5).Select(index =>
                new WeatherForecast
                (
                    DateTime.Now.AddDays(index),
                    Random.Shared.Next(-20, 55),
                    weatherSummaries[Random.Shared.Next(weatherSummaries.Length)]
                ))
                .ToArray();
            return forecast;
        })
        .WithName("GetWeatherForecast");
    
    // Configure the HTTP request pipeline.
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }
    
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    
    app.UseRouting();
    
    app.UseAuthorization();
    
    app.MapRazorPages();
    
    app.Run();
    
    record WeatherForecast(DateTime Date, int TemperatureC, string? Summary)
    {
        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
    } 
    

Test de l’application

  1. Dans Visual Studio, sélectionnez Démarrer sans débogage.

La page web http://localhost:{host} affiche une sortie similaire à l’image suivante. En effet, l’API est appelée sans authentification. Pour effectuer un appel autorisé, reportez-vous aux étapes suivantes pour obtenir des guides pratiques sur l’accès à une API web protégée.

Capture d’écran de l’erreur 401 lors du lancement de la page web.

Étapes suivantes