Jetons JWT en C# (.NET) : création, vérification et validation
JSON Web Token (JWT) est une norme ouverte (RFC 7519) pour la création de jetons d'accès basés sur le format JSON. JWT est largement utilisé dans les applications web modernes pour l'authentification et l'échange d'informations entre le client et le serveur. Dans cet article, nous allons examiner en détail comment travailler avec les jetons JWT dans l'écosystème C# (.NET), y compris la création, la signature, la vérification et la validation des jetons.
Composants principaux de JWT
JWT se compose de trois parties séparées par des points :
- Header — en-tête contenant des informations sur le type de jeton et l'algorithme de signature
- Payload — charge utile avec les données (claims)
- Signature — signature garantissant l'intégrité du jeton
Exemple de jeton JWT : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Installation des packages nécessaires
Pour travailler avec JWT dans .NET, il est nécessaire d'installer le package System.IdentityModel.Tokens.Jwt. Cela peut être fait via NuGet Package Manager ou avec .NET CLI :
dotnet add package System.IdentityModel.Tokens.JwtIl peut également être nécessaire d'installer Microsoft.AspNetCore.Authentication.JwtBearer pour l'intégration avec ASP.NET Core :
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearerCréation d'un jeton JWT en C#
Examinons un exemple complet de création d'un jeton JWT en utilisant une clé symétrique (HMAC SHA256) :
using System;using System.IdentityModel.Tokens.Jwt;using System.Security.Claims;using System.Text;using Microsoft.IdentityModel.Tokens;
public class JwtService{ private readonly string _secretKey; private readonly string _issuer; private readonly string _audience;
public JwtService(string secretKey, string issuer, string audience) { _secretKey = secretKey; _issuer = issuer; _audience = audience; }
public string GenerateToken(string userId, string userName, string role) { var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_secretKey)); var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var claims = new[] { new Claim(ClaimTypes.NameIdentifier, userId), new Claim(ClaimTypes.Name, userName), new Claim(ClaimTypes.Role, role), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), new Claim(JwtRegisteredClaimNames.Iat, new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds().ToString()) };
var token = new JwtSecurityToken( issuer: _issuer, audience: _audience, claims: claims, expires: DateTime.UtcNow.AddHours(1), signingCredentials: credentials );
return new JwtSecurityTokenHandler().WriteToken(token); }}Vérification et validation du jeton JWT
Pour vérifier l'authenticité et extraire les données du jeton, la méthode ValidateToken est utilisée :
public ClaimsPrincipal ValidateToken(string token){ var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.UTF8.GetBytes(_secretKey);
try { var principal = tokenHandler.ValidateToken(token, new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = true, ValidIssuer = _issuer, ValidateAudience = true, ValidAudience = _audience, ValidateLifetime = true, ClockSkew = TimeSpan.Zero\