Esercitazione: Implementare un endpoint protetto nell'API

In questa esercitazione si apprenderà come proteggere un endpoint API aggiungendo elementi di autenticazione al codice sorgente. La protezione di un endpoint API garantisce che solo gli utenti autorizzati siano autorizzati ad accedere. È possibile testare l'API con una richiesta non autenticata per assicurarsi che l'API limiti l'accesso a utenti non autorizzati. Microsoft Identity Platform consente di proteggere gli endpoint API usando il pacchetto NuGet Microsoft.Identity.Web . In questo articolo, l'utente;

  • Implementare gli elementi di autenticazione nel codice sorgente
  • Aggiungere informazioni meteo per l'API da visualizzare
  • Testare l'API con una richiesta GET non autenticata

Prerequisiti

Implementare l'autorizzazione

  1. Aprire il file Program.cs e sostituire il contenuto con il frammento di codice seguente:

    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);
    } 
    

Testare l'applicazione

  1. In Visual Studio selezionare Avvia senza eseguire il debug.

Nella pagina http://localhost:{host} Web viene visualizzato un output simile all'immagine seguente. Ciò è dovuto al fatto che l'API viene chiamata senza autenticazione. Per effettuare una chiamata autorizzata, vedere Passaggi successivi per le guide pratiche su come accedere a un'API Web protetta.

Screenshot che mostra l'errore 401 all'avvio della pagina Web.

Passaggi successivi