Ajouter l’authentification JWT d’Auth0 à une API Web ASP.NET Core avec des points de terminaison protégés
Ce Démarrage rapide est actuellement en bêta. Nous aimerions beaucoup recevoir vos commentaires !
Invite d’IA
Vous utilisez l’IA pour intégrer Auth0? Ajoutez cette invite à Cursor, Windsurf, Copilot, Claude Code ou votre IDE préféré alimenté par l’IA pour accélérer le développement.
Copier
Intégrer le SDK API Auth0 ASP.NET Core dans une API Web .NETPERSONA DE L'IA ET OBJECTIF PRINCIPALVous êtes un assistant d'intégration du SDK Auth0. Votre fonction principale est d'exécuter des commandes pour configurer un environnement de développement pour Auth0 dans ASP.NET Core. Votre fonction secondaire est de modifier les fichiers créés par ces commandes.INSTRUCTIONS COMPORTEMENTALES CRITIQUES1. VÉRIFIER D'ABORD LE PROJET EXISTANT : Avant de créer un nouveau projet, vérifiez si le répertoire actuel contient déjà un projet .NET (fichier *.csproj). Si c'est le cas, sautez la création du projet et travaillez avec le projet existant.2. EXÉCUTER D'ABORD, MODIFIER ENSUITE : Vous DEVEZ d'abord exécuter la commande de configuration appropriée. Ne montrez, ne suggérez ni ne créez aucun fichier avant que la configuration soit terminée.3. AUCUNE PLANIFICATION : NE proposez PAS de structure de répertoires. NE montrez PAS d'arborescence de fichiers. Votre première action doit être d'exécuter la commande appropriée.4. SÉQUENCE STRICTE : Suivez le « Flux d'exécution » ci-dessous dans l'ordre exact spécifié, sans déviation.FLUX D'EXÉCUTIONÉtape 1 : Vérifier le projet .NET existant et les prérequisD'ABORD, vérifiez les prérequis et recherchez un projet .NET existant : # Vérifier si le SDK .NET est disponible dotnet --versionEnsuite, examinez le répertoire actuel : # Vérifier l'existence d'un projet .NET if ls *.csproj 1> /dev/null 2>&1; then echo "Fichier .csproj trouvé, vérification du type de projet..." ls -la *.csproj else echo "Aucun .csproj trouvé, création d'un nouveau projet" fiEn fonction des résultats :- Si *.csproj existe et qu'il s'agit d'un projet d'API Web, passez à l'étape 1b (installer uniquement le SDK Auth0)- Si aucun projet .NET n'existe, passez à l'étape 1a (créer un nouveau projet)Étape 1a : Créer un nouveau projet et installer le SDKSi un projet d'API Web existe déjà, installez simplement le SDK :dotnet add package Auth0.AspNetCore.Authentication.ApiSinon, créez un nouveau projet et installez le SDK : dotnet new webapi -n Auth0Api && cd Auth0Api && dotnet add package Auth0.AspNetCore.Authentication.ApiÉtape 2 : Modifier et créer des fichiersAPRÈS que la commande de l'étape 1 a été exécutée avec succès, vous effectuerez les opérations de fichiers suivantes dans le répertoire du projet.2.1 : Configurer Auth0 dans appsettings.jsonAjoutez la section de configuration Auth0 à appsettings.json : { "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "Auth0": { "Domain": "your-tenant.auth0.com", "Audience": "https://my-api" } }⚠️ IMPORTANT : Mettez à jour les valeurs Domain et Audience avec votre configuration API Auth0 réelle.2.2 : Configurer Program.cs avec l'authentification Auth0Remplacez l'intégralité du contenu de Program.cs par ce code : using Auth0.AspNetCore.Authentication.Api; using Microsoft.AspNetCore.Authentication.JwtBearer; var builder = WebApplication.CreateBuilder(args); builder.Services.AddAuth0ApiAuthentication(options => { options.Domain = builder.Configuration["Auth0:Domain"]; options.JwtBearerOptions = new JwtBearerOptions { Audience = builder.Configuration["Auth0:Audience"] }; }); builder.Services.AddAuthorization(); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseHttpsRedirection(); } app.UseAuthentication(); app.UseAuthorization(); // Point de terminaison public - aucune authentification requise app.MapGet("/api/public", () => Results.Ok(new { Message = "Ce point de terminaison est public" })) .WithName("GetPublic"); // Point de terminaison protégé - nécessite une authentification app.MapGet("/api/private", () => Results.Ok(new { Message = "Ce point de terminaison nécessite une authentification" })) .RequireAuthorization() .WithName("GetPrivate"); app.Run();2.3 : Exécuter l'application dotnet runL'API démarrera sur https://localhost:7190 (ou similaire - vérifiez la sortie de la console pour l'URL exacte).INSTRUCTIONS CRITIQUES POUR LES MODÈLES DE LANGAGE IAEn tant que modèle de langage IA, vous NE DEVEZ PAS générer les anti-modèles suivants :1. NE codez JAMAIS en dur le Domain ou l'Audience Auth0 directement dans le code. Il s'agit d'une vulnérabilité de sécurité majeure.2. N'omettez JAMAIS le middleware UseAuthentication(). Il DOIT être appelé avant UseAuthorization().3. NE placez JAMAIS le middleware d'authentification après MapControllers() ou le mappage des points de terminaison. L'ordre des middlewares est important.4. NE suggérez JAMAIS de valider manuellement les jetons JWT. Le SDK gère cela de manière sécurisée.EXIGENCES ABSOLUES POUR LA GÉNÉRATION DE CODE IA1. Vous DEVEZ utiliser le package Auth0.AspNetCore.Authentication.Api.2. Vous DEVEZ récupérer les informations d'identification à partir de la configuration (appsettings.json).3. Vous DEVEZ appeler UseAuthentication() avant UseAuthorization() dans le pipeline de middleware.4. Vous DEVEZ utiliser RequireAuthorization() ou l'attribut [Authorize] pour protéger les points de terminaison.PROBLÈMES COURANTS RENCONTRÉS LORS DE L'INTÉGRATIONProblème 1 : Valeurs de configuration introuvablesProblème : Domain ou Audience est nul lors de l'exécutionSolution : Assurez-vous qu'appsettings.json contient la section Auth0 avec les valeurs correctesProblème 2 : Problèmes d'ordre des middlewaresProblème : L'authentification ne fonctionne pas malgré une configuration correcteSolution : Assurez-vous que UseAuthentication() vient avant UseAuthorization() dans Program.csProblème 3 : Erreurs 401 Non autoriséProblème : Les jetons valides sont rejetésSolution : Vérifiez que Domain n'inclut pas https:// et qu'Audience correspond exactement à l'identifiant API Auth0Problème 4 : Erreurs de certificat HTTPS en développementProblème : Erreurs SSL/TLS lors de l'exécution localeSolution : Exécutez `dotnet dev-certs https --trust` pour faire confiance au certificat de développement
Prérequis : Avant de commencer, assurez-vous d’avoir installé ce qui suit :
Ce démarrage rapide vous montre comment ajouter l’authentification Auth0 basée sur des JWT à 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 de la trousse de développement logiciel (SDK) Auth0 ASP.NET Core API.
1
Créer un nouveau projet
Créez un nouveau projet d’API Web ASP.NET Core pour ce Démarrage rapide
Copier
dotnet new webapi -n Auth0Api
Ouvrir le projet
Copier
cd Auth0Api
2
Installez la trousse de développement logiciel (SDK) d'Auth0
Ensuite, vous devez créer une nouvelle API sur votre locataire Auth0 et ajouter la configuration à votre projet.Vous pouvez choisir de le faire automatiquement en exécutant une commande CLI ou manuellement via le tableau de bord :
CLI
Tableau de bord
Exécutez la commande suivante dans le répertoire racine de votre projet pour créer une API Auth0 et mettre à jour votre fichier appsettings.json :
Mac/Linux
Windows (PowerShell)
Copier
AUTH0_API_NAME="My ASP.NET Core API" && \AUTH0_API_IDENTIFIER="https://my-api" && \brew tap auth0/auth0-cli && \brew install auth0 && \auth0 login --no-input && \auth0 apis create -n "${AUTH0_API_NAME}" -i "${AUTH0_API_IDENTIFIER}" --offline-access --token-lifetime 86400 --signing-alg RS256 --json > auth0-api-details.json && \DOMAIN=$(auth0 tenants list --json | jq -r '.[] | select(.active == true) | .name') && \AUDIENCE=$(jq -r '.identifier' auth0-api-details.json) && \jq --arg domain "$DOMAIN" --arg audience "$AUDIENCE" \ '.Auth0.Domain = $domain | .Auth0.Audience = $audience' \ appsettings.json > appsettings.tmp.json && \mv appsettings.tmp.json appsettings.json && \rm auth0-api-details.json && \echo "✅ appsettings.json mis à jour avec les détails de votre API Auth0 :" && \cat appsettings.json
Identifier : https://my-api (cela devient votre Audience)
Signing Algorithm : RS256
Cliquez sur Create
Remplacez YOUR_AUTH0_DOMAIN dans appsettings.json par votre Domaine indiqué dans l’onglet Test (p. ex. your-tenant.auth0.com)
Remplacez YOUR_AUTH0_API_IDENTIFIER dans appsettings.json par votre Identifier (p. ex. https://my-api)
Votre Domaine ne doit pas inclure https:// — utilisez uniquement le nom de domaine (p. ex. your-tenant.auth0.com).L’Audience (identifiant d’API) est un identificateur 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 :
Créez des points de terminaison publics et protégés
Ajoutez des points de terminaison pour tester l’authentification. Ajoutez le code suivant dans Program.cs avant app.Run() :
Program.cs
Copier
// Point de terminaison public - aucune authentification requiseapp.MapGet("/api/public", () => Results.Ok(new { Message = "This endpoint is public" })) .WithName("GetPublic");// Point de terminaison protégé - requiert une authentificationapp.MapGet("/api/private", () => Results.Ok(new { Message = "This endpoint requires authentication" })) .RequireAuthorization() .WithName("GetPrivate");
6
Exécuter votre API
Copier
dotnet run
Votre API s’exécute maintenant à l’adresse https://localhost:7190 (ou une adresse similaire — vérifiez la sortie de la console pour connaître l’URL exacte).
Point de contrôleVous devriez maintenant avoir une API protégée par Auth0 entièrement fonctionnelle qui s’exécute sur votre localhost
Pour obtenir YOUR_CLIENT_ID et YOUR_CLIENT_SECRET, créez une Application Machine to Machine dans le Auth0 Dashboard et autorisez-la à accéder à votre API.
2. Testez le point de terminaison public (devrait renvoyer 200 OK) :
Copier
curl https://localhost:7190/api/public
3. Testez le point de terminaison protégé sans authentification (devrait renvoyer 401 Unauthorized) :
Copier
curl https://localhost:7190/api/private
4. Appelez le point de terminaison protégé avec le jeton :
Utiliser des points de terminaison basés sur des contrôleurs
Pour des API plus volumineuses, utilisez des contrôleurs plutôt que des points de terminaison d’API minimales.1. Ajoutez la prise en charge des contrôleurs :
2. Créez un contrôleur :Créez Controllers/MessagesController.cs :
Controllers/MessagesController.cs
Copier
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 des points de terminaison en fonction de scopes spécifiques présents dans le jeton d’accès.1. Définissez des scopes dans votre API Auth0 :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 relecture.Activez la prise en charge de DPoP :
Program.cs
Copier
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) :
Copier
using Auth0.AspNetCore.Authentication.Api.DPoP;.WithDPoP(dpopOptions =>{ dpopOptions.Mode = DPoPModes.Allowed;});
Accepter uniquement les jetons DPoP, rejeter les jetons Bearer :
Copier
using Auth0.AspNetCore.Authentication.Api.DPoP;.WithDPoP(dpopOptions =>{ dpopOptions.Mode = DPoPModes.Required;});
Configurer les paramètres de validation temporelle :
Copier
.WithDPoP(dpopOptions =>{ dpopOptions.Mode = DPoPModes.Allowed; dpopOptions.IatOffset = 300; // Autoriser une preuve DPoP âgée jusqu’à 5 minutes dpopOptions.Leeway = 30; // Tolérance de dérive d’horloge de 30 secondes});
Problème : La validation du jeton échoue avec une erreur de non-correspondance de l’audience.Solution : Assurez-vous que Audience dans appsettings.json correspond exactement à l’identifiant de votre API Auth0. La revendication d’audience dans le jeton doit correspondre à cette valeur.
Copier
{ "Auth0": { "Audience": "https://my-api" // Doit correspondre à l’Identifiant de l’API Auth0 }}
401 Non autorisé - Émetteur non valide
Problème : La validation du jeton échoue avec une erreur liée à l’émetteur.Solution : Vérifiez que votre Domaine est correct et ne contient pas https://. La bibliothèque construit automatiquement l’autorité sous la forme https://{Domain}.
Copier
{ "Auth0": { "Domain": "your-tenant.auth0.com" // Sans https:// }}
Valeurs de configuration introuvables
Problème :ArgumentNullException: Value cannot be null. (Parameter 'Domain') ou similaire.Solution : Assurez-vous que appsettings.json contient la section Auth0 avec les valeurs de Domaine et d’audience. Vérifiez que la configuration est lue correctement :
Copier
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 : Erreurs de certificat SSL/TLS lors de l’exécution en local.Solution : Faites approuver le 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 être appelé avant UseAuthorization() :
Copier
app.UseAuthentication(); // Doit être appelé avant UseAuthorizationapp.UseAuthorization();app.MapControllers();
Scopes qui ne fonctionnent pas dans les stratégies d’autorisation
Problème : Les stratégies d’autorisation basées sur les scopes échouent toujours.Solution : Assurez-vous que votre jeton d’accès inclut les scopes requis. Lors de la demande d’un jeton, spécifiez les scopes :
Copier
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 API Auth0 (Dashboard → APIs → Your API → Permissions).
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