Tutorial: implementar um ponto de extremidade protegido na sua API

Neste tutorial, você aprenderá a proteger um ponto de extremidade de API adicionando elementos de autenticação ao código-fonte. A proteção de um ponto de extremidade de API garante que somente usuários autorizados tenham acesso autorizado. Você pode testar a API com uma solicitação não autenticada para garantir que sua API restrinja o acesso a usuários não autorizados. A plataforma de identidade da Microsoft fornece uma maneira de proteger os pontos de extremidade da API usando o pacote Microsoft.Identity.Web NuGet. Neste artigo, você;

  • Implementar elementos de autenticação no código-fonte
  • Adicione informações meteorológicas para a exibição da API
  • Testar a API com uma solicitação GET não autenticada

Pré-requisitos

Implementar a autorização

  1. Abra o arquivo Program.cs e substitua o conteúdo pelo seguinte trecho:

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

Testar o aplicativo

  1. No Visual Studio, selecione Iniciar sem depurar.

A página da Web http://localhost:{host} exibe uma saída semelhante à seguinte imagem. Isso ocorre porque a API está sendo chamada sem autenticação. Para fazer uma chamada autorizada, consulte Próximas etapas para obter as guias de instruções sobre como acessar uma API da Web protegida.

Captura de tela mostrando o erro 401 quando a página da Web é inicializada.

Próximas etapas