Agrega la autenticación JWT de Auth0 a una API web de ASP.NET Core con endpoints protegidos
Esta guía de inicio rápido está actualmente en Beta. ¡Nos encantaría conocer sus comentarios!
Usa IA para integrar Auth0
Si usa un asistente de código con IA como Claude Code, Cursor o GitHub Copilot, puede agregar la autenticación de Auth0 automáticamente en minutos con agent skills.Instalar:
Add Auth0 JWT authentication to my ASP.NET Core Web API
Su asistente de IA creará automáticamente su API de Auth0, recuperará las credenciales, instalará el SDK de la API de autenticación de Auth0 para ASP.NET Core, configurará la autenticación JWT Bearer e implementará endpoints de API protegidos. Documentación completa de agent skills →
Requisitos previos: Antes de comenzar, asegúrese de tener instalado lo siguiente:
Esta guía de inicio rápido muestra cómo agregar autenticación JWT de Auth0 a una API web de ASP.NET Core. Creará una API segura con endpoints protegidos mediante el SDK de API de Auth0 para ASP.NET Core.
1
Crear un nuevo proyecto
Cree un nuevo proyecto de API web de ASP.NET Core para esta guía de inicio rápido
A continuación, debes crear una nueva API en tu tenant de Auth0 y agregar la configuración a tu proyecto.Puede hacerlo automáticamente ejecutando un comando de CLI o de forma manual a través del Dashboard:
CLI
Dashboard
Ejecute el siguiente comando de shell desde el directorio raíz de su proyecto para crear una API de Auth0 y actualizar el archivo appsettings.json:
Identifier: https://my-api (esta será tu Audiencia)
Signing Algorithm: RS256
Haz clic en Create
Reemplaza YOUR_AUTH0_DOMAIN en appsettings.json por tu dominio de la pestaña Test (por ejemplo, your-tenant.auth0.com)
Reemplaza YOUR_AUTH0_API_IDENTIFIER en appsettings.json por tu Identifier (por ejemplo, https://my-api)
Tu dominio no debe incluir https://; usa solo el nombre de dominio (por ejemplo, your-tenant.auth0.com).La Audiencia (identificador de API) es un identificador único para tu API y puede ser cualquier URI válida. No tiene que ser una URL de acceso público.
4
Configurar la autenticación
Reemplace todo el contenido de Program.cs con el siguiente código:
2. Crea un controlador:Crea Controllers/MessagesController.cs:
Controllers/MessagesController.cs
using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Mvc;namespace Auth0Api.Controllers;[ApiController][Route("api/[controller]")]public class MessagesController : ControllerBase{ [HttpGet] public IActionResult GetPublic() { return Ok(new { Message = "This endpoint is public" }); } [Authorize] [HttpGet("private")] public IActionResult GetPrivate() { var userId = User.FindFirst("sub")?.Value; return Ok(new { Message = "This endpoint is protected", UserId = userId }); } [Authorize(Policy = "read:messages")] [HttpGet("messages")] public IActionResult GetMessages() { return Ok(new { Messages = new[] { "Message 1", "Message 2" } }); }}
Proteger rutas con autorización basada en alcances
Protege endpoints en función de alcances específicos en el token de acceso.1. Define alcances en tu API de Auth0:En el Auth0 Dashboard → APIs → Tu API → Permissions, agrega los alcances:
DPoP (Demostración de prueba de posesión) vincula los tokens de acceso a claves criptográficas, lo que evita el robo de tokens y los ataques de repetición.Habilite la compatibilidad con DPoP:
Program.cs
builder.Services.AddAuth0ApiAuthentication(options =>{ options.Domain = builder.Configuration["Auth0:Domain"]; options.JwtBearerOptions = new JwtBearerOptions { Audience = builder.Configuration["Auth0:Audience"] };}).WithDPoP(); // Habilita DPoP con la configuración predeterminada
Modos de DPoP:Acepte tokens DPoP y Bearer (predeterminado):
using Auth0.AspNetCore.Authentication.Api.DPoP;.WithDPoP(dpopOptions =>{ dpopOptions.Mode = DPoPModes.Allowed;});
Acepte solo tokens DPoP y rechace los tokens Bearer:
using Auth0.AspNetCore.Authentication.Api.DPoP;.WithDPoP(dpopOptions =>{ dpopOptions.Mode = DPoPModes.Required;});
Configure los parámetros de validación de tiempo:
.WithDPoP(dpopOptions =>{ dpopOptions.Mode = DPoPModes.Allowed; dpopOptions.IatOffset = 300; // Permite pruebas de DPoP con hasta 5 minutos de antigüedad dpopOptions.Leeway = 30; // Tolerancia de 30 segundos para el desfase del reloj});
Problema: La validación del token falla porque la audiencia no coincide.Solución: Asegúrate de que Audience en appsettings.json coincida exactamente con el identificador de tu API de Auth0. El claim audience del token debe coincidir con este valor.
{ "Auth0": { "Audience": "https://my-api" // Debe coincidir con el identificador de la API de Auth0 }}
401 No autorizado: emisor no válido
Problema: La validación del token falla con un error de emisor.Solución: Verifica que tu dominio sea correcto y que no incluya https://. La biblioteca construye automáticamente la autoridad como https://{Domain}.
{ "Auth0": { "Domain": "your-tenant.auth0.com" // Sin https:// }}
No se encontraron los valores de configuración
Problema:ArgumentNullException: Value cannot be null. (Parameter 'Domain') o similar.Solución: Asegúrate de que appsettings.json contenga la sección de Auth0 con los valores de Domain y Audience. Comprueba que la configuración se esté leyendo correctamente:
builder.Services.AddAuth0ApiAuthentication(options =>{ options.Domain = builder.Configuration["Auth0:Domain"] ?? throw new InvalidOperationException("Auth0:Domain is required"); options.JwtBearerOptions = new JwtBearerOptions { Audience = builder.Configuration["Auth0:Audience"] ?? throw new InvalidOperationException("Auth0:Audience is required") };});
Errores de certificado HTTPS en desarrollo
Problema: Se producen errores de certificado SSL/TLS al ejecutar localmente.Solución: Confía en el certificado de desarrollo:
Problema: La autenticación no funciona a pesar de que la configuración es correcta.Solución: Asegúrate de que el middleware esté en el orden correcto. UseAuthentication() debe ir antes de UseAuthorization():
app.UseAuthentication(); // Debe ir antes de UseAuthorizationapp.UseAuthorization();app.MapControllers();
Los alcances no funcionan en las políticas de autorización
Problema: Las políticas de autorización basadas en alcances siempre fallan.Solución: Asegúrate de que tu token de acceso incluya los alcances requeridos. Al solicitar un token, especifica los alcances:
curl --request POST \ --url https://YOUR_DOMAIN/oauth/token \ --data '{"client_id":"...","client_secret":"...","audience":"...","grant_type":"client_credentials","scope":"read:messages write:messages"}'
Verifica también que los alcances estén definidos en la configuración de tu API de Auth0 (Dashboard → APIs → Your API → Permissions).
En el repositorio del SDK hay disponible una aplicación de ejemplo completa que demuestra todas las funcionalidades.
Aplicación de entorno de pruebas
Incluye endpoints públicos y protegidos, compatibilidad con DPoP, integración con Swagger UI y una colección de Postman
Clone y ejecute:
git clone https://github.com/auth0/aspnetcore-api.gitcd aspnetcore-api/Auth0.AspNetCore.Authentication.Api.Playground# Actualiza appsettings.json con tu configuración de Auth0dotnet run