Ajoutez l’authentification JWT d’Auth0 à une API Web ASP.NET Core avec des points de terminaison protégés
Ce Quickstart est actuellement en bêta. Nous aimerions beaucoup connaître votre avis!
Utiliser l’IA pour intégrer Auth0
Si vous utilisez un assistant IA de codage comme Claude Code, Cursor ou GitHub Copilot, vous pouvez ajouter automatiquement l’authentification Auth0 en quelques minutes à l’aide d’Agent Skills.Installer :
npx skills add auth0/agent-skills --skill auth0
Demandez ensuite à votre assistant IA :
Add Auth0 JWT authentication to my ASP.NET Core Web API
Votre assistant IA créera automatiquement votre API Auth0, récupérera les informations d’identification, installera le SDK Auth0 ASP.NET Core Authentication API, configurera l’authentification JWT Bearer et implémentera des points de terminaison d’API protégés. Documentation complète sur Agent Skills →
Prérequis : Avant de commencer, assurez-vous d’avoir installé les éléments suivants :
Ce Quickstart montre comment ajouter l’authentification JWT d’Auth0 à une API Web ASP.NET Core. Vous allez créer une API sécurisée avec des points de terminaison protégés à l’aide du SDK d’API ASP.NET Core d’Auth0.
1
Créer un nouveau projet
Créez un nouveau projet ASP.NET Core Web API pour ce Quickstart
Ensuite, vous devez créer une nouvelle API sur votre tenant Auth0 et ajouter la configuration à votre projet.Vous pouvez effectuer cette opération automatiquement en exécutant une commande CLI ou le faire manuellement via le Dashboard :
CLI
Dashboard
Exécutez la commande shell suivante à la racine de votre projet pour créer une API Auth0 et mettre à jour votre fichier appsettings.json :
Identifiant : https://my-api (cela devient votre audience)
Signing Algorithm : RS256
Cliquez sur Create
Remplacez YOUR_AUTH0_DOMAIN dans appsettings.json par votre Domain de l’onglet Test (p. ex. your-tenant.auth0.com)
Remplacez YOUR_AUTH0_API_IDENTIFIER dans appsettings.json par votre Identifiant (p. ex. https://my-api)
Votre Domain ne doit pas inclure https:// — utilisez seulement le nom de domaine (p. ex. your-tenant.auth0.com).L’Audience (identifiant d’API) est un identifiant unique pour votre API et peut être n’importe quel URI valide. Il n’a pas besoin d’être une URL accessible publiquement.
4
Configurer l’authentification
Remplacez l’intégralité du contenu de Program.cs par le code suivant :
Utiliser des points de terminaison basés sur des contrôleurs
Pour les API plus volumineuses, utilisez des contrôleurs plutôt que des points de terminaison d’API minimaux.1. Ajoutez la prise en charge des contrôleurs :
2. Créez un contrôleur :Créez 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" } }); }}
Protéger des routes avec une autorisation basée sur les scopes
Protégez les points de terminaison en fonction de scopes précis dans le jeton d’accès.1. Définissez des scopes dans votre Auth0 API :Dans le Auth0 Dashboard → APIs → Your API → Permissions, ajoutez des scopes :
DPoP (Demonstration of Proof-of-Possession) lie les jetons d’accès à des clés cryptographiques, ce qui empêche le vol de jetons et les attaques par rejeu.Activer la prise en charge de DPoP :
Program.cs
builder.Services.AddAuth0ApiAuthentication(options =>{ options.Domain = builder.Configuration["Auth0:Domain"]; options.JwtBearerOptions = new JwtBearerOptions { Audience = builder.Configuration["Auth0:Audience"] };}).WithDPoP(); // Activer DPoP avec les paramètres par défaut
Modes DPoP :Accepter à la fois les jetons DPoP et Bearer (par défaut) :
using Auth0.AspNetCore.Authentication.Api.DPoP;.WithDPoP(dpopOptions =>{ dpopOptions.Mode = DPoPModes.Allowed;});
Accepter uniquement les jetons DPoP et rejeter les jetons Bearer :
using Auth0.AspNetCore.Authentication.Api.DPoP;.WithDPoP(dpopOptions =>{ dpopOptions.Mode = DPoPModes.Required;});
Configurer les paramètres de validation temporelle :
.WithDPoP(dpopOptions =>{ dpopOptions.Mode = DPoPModes.Allowed; dpopOptions.IatOffset = 300; // Autoriser une preuve DPoP datant d’au plus 5 minutes dpopOptions.Leeway = 30; // Tolérance de décalage d’horloge de 30 secondes});
Problème : La validation du token échoue en raison d’une erreur de non-correspondance de l’audience.Solution : Assurez-vous que Audience dans appsettings.json correspond exactement à l’identifier de votre Auth0 API. La claim audience du token doit correspondre à cette valeur.
{ "Auth0": { "Audience": "https://my-api" // Doit correspondre à l’identifier de l’Auth0 API }}
401 Non autorisé - émetteur invalide
Problème : La validation du token échoue en raison d’une erreur liée à l’émetteur.Solution : Vérifiez que votre Domain est correct et n’inclut pas https://. La library construit automatiquement l’autorité au format https://{Domain}.
{ "Auth0": { "Domain": "your-tenant.auth0.com" // Sans https:// }}
Valeurs de configuration introuvables
Problème :ArgumentNullException: Value cannot be null. (Parameter 'Domain') ou un message semblable.Solution : Assurez-vous que appsettings.json contient la section Auth0 avec les valeurs Domain et Audience. Vérifiez également que la configuration est lue correctement :
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") };});
Erreurs de certificat HTTPS en développement
Problème : Des erreurs de certificat SSL/TLS se produisent lors de l’exécution en local.Solution : Faites confiance au certificat de développement :
Problème : L’authentification ne fonctionne pas malgré une configuration correcte.Solution : Assurez-vous que le middleware est dans le bon ordre. UseAuthentication() doit venir avant UseAuthorization() :
app.UseAuthentication(); // Doit être avant UseAuthorizationapp.UseAuthorization();app.MapControllers();
Les scopes ne fonctionnent pas dans les politiques d’autorisation
Problème : Les politiques d’autorisation basées sur des scopes échouent systématiquement.Solution : Assurez-vous que votre jeton d’accès inclut les scopes requis. Lorsque vous demandez un token, précisez les scopes :
curl --request POST \ --url https://YOUR_DOMAIN/oauth/token \ --data '{"client_id":"...","client_secret":"...","audience":"...","grant_type":"client_credentials","scope":"read:messages write:messages"}'
Vérifiez aussi que les scopes sont définis dans les paramètres de votre Auth0 API (Dashboard → APIs → Your API → Permissions).
Une application d’exemple complète qui présente toutes les fonctionnalités est disponible dans le dépôt du SDK.
Application de démonstration
Comprend des points de terminaison publics et protégés, la prise en charge de DPoP, l’intégration de Swagger UI et une collection Postman
Clonez et exécutez :
git clone https://github.com/auth0/aspnetcore-api.gitcd aspnetcore-api/Auth0.AspNetCore.Authentication.Api.Playground# Mettez à jour appsettings.json avec votre configuration Auth0dotnet run