API web protegida: Configuración del código

Para configurar el código de la API web protegida, entienda lo siguiente:

  • Qué define las API como protegidas.
  • Cómo configurar un token de portador.
  • Cómo validar el token.

¿Qué define que las API de ASP.NET o ASP.NET Core sean protegidas?

Al igual que las aplicaciones web, las API web de ASP.NET y ASP.NET Core están protegidas porque sus acciones de controlador llevan como prefijo el atributo [Authorize]. Solo se puede llamar a las acciones de controlador si se llama a la API con una identidad autorizada.

Tenga en cuenta las preguntas siguientes:

  • Solo una aplicación puede llamar a una API web. ¿Cómo conoce la API web la identidad de la aplicación que le llama?
  • Si la aplicación llama a la API en nombre de un usuario, ¿cuál es la identidad del usuario?

Token de portador

El token de portador que se establece en el encabezado cuando se llama a la aplicación contiene información sobre la identidad de la aplicación. También contiene información sobre el usuario a menos que la aplicación web acepte llamadas de servicio a servicio desde una aplicación de demonio.

Este es un ejemplo de código de C# que muestra a un cliente que llama a la API después de adquirir un token con la Biblioteca de autenticación de Microsoft para .NET (MSAL.NET):

var scopes = new[] {$"api://.../access_as_user"};
var result = await app.AcquireToken(scopes)
                      .ExecuteAsync();

httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);

// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);

Importante

Una aplicación cliente solicita el token de portador a la Plataforma de identidad de Microsoft para la API web. La API es la única aplicación que debe comprobar el token y ver las notificaciones que contiene. Las aplicaciones cliente nunca deben intentar inspeccionar las notificaciones de los tokens.

En el futuro, la API web podría requerir que el token esté cifrado. Este requisito podría impedir el acceso a las aplicaciones cliente que pueden ver los tokens de acceso.

Configuración de JwtBearer

En esta sección se describe cómo configurar un token de portador.

Archivo config

Debe especificar TenantId únicamente si desea aceptar tokens de acceso de un solo inquilino (aplicación de línea de negocio). De lo contrario, se puede dejar como common. Los distintos valores pueden ser:

  • Un GUID (id. de inquilino = id. de directorio)
  • common puede ser cualquier organización y cuentas personales
  • organizations puede ser cualquier organización
  • consumers son cuentas personales Microsoft
{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "Enter_the_Application_(client)_ID_here",
    "TenantId": "common"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

Uso de un URI del identificador de aplicación personalizado para una API web

Si ha aceptado el URI del identificador de aplicación predeterminado que propone Azure Portal, no es necesario especificar el público (consulte URI y ámbitos del identificador de aplicación). De lo contrario, agregue una propiedad Audience cuyo valor sea el URI del identificador de aplicación para la API web. Normalmente empieza por api://.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "Enter_the_Application_(client)_ID_here",
    "TenantId": "common",
    "Audience": "Enter_the_Application_ID_URI_here"
  },
}

Inicialización del código

Cuando se llama a una aplicación en una acción de controlador que contiene un atributo [Authorize] , ASP.NET y ASP.NET Core extraen el token de acceso del token de portador del encabezado de autorización. Después, el token se reenvía al middleware JwtBearer, que llama a las extensiones de Microsoft IdentityModel para .NET.

Microsoft.Identity.Web

Microsoft recomienda usar el paquete NuGet Microsoft.Identity.Web al desarrollar una API web con ASP.NET Core.

Microsoft.Identity.Web es el pegamento entre ASP.NET Core, el middleware de autenticación y la Biblioteca de autenticación de Microsoft (MSAL) para .NET. Ofrece una experiencia de desarrollador más clara y sólida, y aprovecha la eficacia de la Plataforma de identidad de Microsoft y Azure AD B2C.

ASP.NET para .NET 6.0

A fin de crear un proyecto de API web que use Microsoft.Identity.Web, use una plantilla de proyecto en la CLI de .NET 6.0 o en Visual Studio.

CLI del núcleo del Dotnet

# Create new web API that uses Microsoft.Identity.Web
dotnet new webapi --auth SingleOrg

Visual Studio: para crear un proyecto de API web en Visual Studio, seleccione Archivo>Nuevo>Proyecto>ASP.NET Core Web API.

Tanto las plantillas de proyecto de la CLI de .NET como de Visual Studio crean un archivo Program.cs que tiene un aspecto similar a este fragmento de código. Observe la directiva using de Microsoft.Identity.Web y las líneas que contienen autenticación y autorización.

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();