Jetons JWT en C# (.NET) : travailler avec System.IdentityModel.Tokens.Jwt

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Jetons JWT en C# (.NET) : guide complet pour travailler avec System.IdentityModel.Tokens.Jwt

\n\n

JSON Web Token (JWT) est un format compact et sécurisé pour les URL, permettant de transférer des données entre parties sous la forme d'un objet JSON. Dans l'écosystème C# (.NET), la bibliothèque puissante System.IdentityModel.Tokens.Jwt, qui fait partie du package Microsoft.IdentityModel.Tokens, est utilisée pour travailler avec JWT. Cet outil permet de générer, signer, vérifier et décoder les jetons JWT, assurant une authentification sécurisée et un échange de données dans les applications web, API et microservices.

\n\n

Installation de la bibliothèque

\n

Pour commencer, ajoutez le package NuGet à votre projet. Exécutez la commande dans la console du gestionnaire de packages :

\n
dotnet add package System.IdentityModel.Tokens.Jwt
\n

Ou via la console du gestionnaire de packages dans Visual Studio :

\n
Install-Package System.IdentityModel.Tokens.Jwt
\n\n

Composants principaux de la bibliothèque

\n
    \n
  • JwtSecurityTokenHandler — la classe principale pour créer, sérialiser et vérifier les jetons.
  • \n
  • SecurityTokenDescriptor — la description du jeton : claims, durée de vie, signature.
  • \n
  • SymmetricSecurityKey — la clé symétrique pour la signature (HS256, HS384, HS512).
  • \n
  • SigningCredentials — les informations d'identification de signature (algorithme + clé).
  • \n
  • TokenValidationParameters — les paramètres de validation (vérification de la signature, de la durée de vie, de l'émetteur).
  • \n
\n\n

Génération d'un jeton JWT en C#

\n

Créons un jeton simple avec des claims (revendications) personnalisées et une durée de vie de 1 heure :

\n
using System.IdentityModel.Tokens.Jwt;\nusing System.Security.Claims;\nusing System.Text;\nusing Microsoft.IdentityModel.Tokens;\n\npublic string GenerateToken()\n{\n    var secretKey = "my_super_secret_key_1234567890!";\n    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));\n    var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);\n\n    var claims = new[]\n    {\n        new Claim(ClaimTypes.Name, "Иван Петров"),\n        new Claim(ClaimTypes.Email, "ivan@example.com"),\n        new Claim(ClaimTypes.Role, "Admin")\n    };\n\n    var tokenDescriptor = new SecurityTokenDescriptor\n    {\n        Subject = new ClaimsIdentity(claims),\n        Expires = DateTime.UtcNow.AddHours(1),\n        Issuer = "MyApp",\n        Audience = "MyAppUsers",\n        SigningCredentials = credentials\n    };\n\n    var tokenHandler = new JwtSecurityTokenHandler();\n    var token = tokenHandler.CreateToken(tokenDescriptor);\n    return tokenHandler.WriteToken(token);\n}
\n\n

Vérification (validation) d'un jeton JWT

\n

Lors de la réception d'un jeton du client, il est nécessaire de vérifier sa signature, sa date d'expiration et d'autres paramètres :

\n
public ClaimsPrincipal ValidateToken(string token)\n{\n    var secretKey = "my_super_secret_key_1234567890!";\n    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));\n\n    var tokenHandler = new JwtSecurityTokenHandler();\n    var validationParameters = new TokenValidationParameters\n    {\n        ValidateIssuer = true,\n        ValidIssuer = "MyApp",\n        ValidateAudience = true,\n        ValidAudience = "MyAppUsers",\n        ValidateLifetime = true,\n        IssuerSigningKey = key,\n        ClockSkew = TimeSpan.Zero // supprime la marge de temps par défaut\n    };\n\n    try\n    {\n        var principal = tokenHandler.ValidateToken(token, validationParameters, out SecurityToken validatedToken);\n        return principal;\n    }\n    catch (SecurityTokenExpiredException)\n    {\n        Console.WriteLine("Le jeton a expiré");\n        return null;\n    }\n    catch (SecurityTokenInvalidSignatureException)\n    {\n        Console.WriteLine("Signature du jeton invalide");\n        return null;\n    }\n}
\n\n

Décodage du jeton sans vérification de la signature

\n

Parfois, il suffit de lire

Recommendations