Tutorial: Implementación de un punto de conexión protegido en la API

En este tutorial, aprenderá a proteger puntos de conexión de API mediante la adición de elementos de autenticación al código fuente. La protección de un punto de conexión de API garantiza que solo se permita el acceso a los usuarios autorizados. Pruebe la API con una solicitud no autenticada para asegurarse de que la API restrinja el acceso a usuarios no autorizados. La plataforma de identidad de Microsoft proporciona una manera de proteger los puntos de conexión de API mediante el paquete NuGet Microsoft.Identity.Web. En este artículo;

  • Implementará elementos de autenticación en el código fuente
  • Agregar información meteorológica para que se muestre la API
  • Probar la API con una solicitud GET no autenticada

Prerrequisitos

Implementar la autorización

  1. Abra el archivo Program.cs y sustituya el contenido por el fragmento de código siguiente:

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

Prueba de la aplicación

  1. En Visual Studio, seleccione Iniciar sin depurar.

La página web http://localhost:{host} muestra una salida similar a la siguiente imagen. Esto se debe a que se llama a la API sin autenticación. Para realizar una llamada autorizada, consulte Pasos siguientes para obtener instrucciones sobre cómo acceder a una API web protegida.

Captura de pantalla que muestra el error 401 cuando se inicia la página web.

Pasos siguientes