Les JSON Web Tokens (JWT), standardisés par la RFC 7519, offrent un mécanisme compact et autonmoe pour échanger des données sécurisées entre différentes entités sous forme d'objets JSON. L'intégrité de ces jetons est garantie par une signature numérique. Dans l'écosystème .NET, la manipulation de ces jetons est grandement facilitée par des bibliothèques dédiées permettant la création, l'analyse et la validation cryptographique.
Capacités de l'écosystème JWT en .NET
L'implémentation native et les bibliothèques communautaires pour .NET supportent un large éventail d'algorithmes de signature, qu'ils soient symétriques (HMAC) ou asymétriques (RSA, ECDSA). Elles s'intègrent nativement avec les middlewares d'authentification d'ASP.NET Core et sont totalement compatibles avec les environnements multiplateformes (Windows, Linux, macOS).
Configuraton de l'authentification par jeton
Pour intégrer la validation des JWT dans une application ASP.NET Core moderne, il est nécesssaire d'ajouter le paquet NuGet correspondant :
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
Ensuite, configurez le middleware d'authentification dans le fichier Program.cs en définissant les paramètres de validation stricts :
var builder = WebApplication.CreateBuilder(args);
var secretKey = builder.Configuration["SecuritySettings:TokenSecret"];
var keyBytes = Encoding.UTF8.GetBytes(secretKey);
var securityKey = new SymmetricSecurityKey(keyBytes);
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(cfg =>
{
cfg.RequireHttpsMetadata = true;
cfg.SaveToken = true;
cfg.TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKey = securityKey,
ValidIssuer = builder.Configuration["SecuritySettings:Issuer"],
ValidAudience = builder.Configuration["SecuritySettings:Audience"],
ValidateIssuerSigningKey = true,
ValidateIssuer = true,
ValidateAudience = true,
ClockSkew = TimeSpan.Zero
};
});
builder.Services.AddAuthorization();
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
Protection des points de terminaison
Une fois le pipeline d'authentification configuré, vous pouvez restreindre l'accès à vos contrôleurs ou méthodes spécifiques en appliquant l'attribut d'autorisation :
[ApiController]
[Route("api/[controller]")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class SecureDataController : ControllerBase
{
[HttpGet("profile")]
public IActionResult GetUserData()
{
// Logique métier accessible uniquement avec un jeton valide
return Ok(new { Status = "Success", Message = "Accès autorisé" });
}
}