Distinction entre authentification et autorisation
L'authentification détermine l'identité d'un utilisateur, tandis que l'autorisation gère les droits d'accès aux ressources. Pour appliquer des restrictions, il est impératif de connaître l'identité préalablement authentifiée.
Principe de JWT
JSON Web Token (JWT) est un mécanisme d'échange de données sécurisé basé sur JSON. Il s'articule autour de trois éléments : l'en-tête (header), le contenu (payload) et la signature.
L'en-tête indique la méthode de chiffrement utilisée, par exemple HS256 pour HMAC-SHA256.
header = '{"alg":"HS256","typ":"JWT"}'
Le contenu véhicule les informations utiles, tellles que le rôle de l'utilisateur.
payload = '{"role":"administrateur","iat":1633046400}'
La signature est calculée à partir de l'encodage Base64 de l'en-tête et du contenu, avec une clé privée.
cle = 'cleSecrete'
jetonNonSigne = encodeBase64(header) + '.' + encodeBase64(payload)
signature = HMAC-SHA256(cle, jetonNonSigne)
jeton = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature)
Le jeton JWT est généralement transmis via l'en-tête HTTP Authorization pour accéder à des endpoints protégés.
Authorization: Bearer eyJhbGci...<tronqu>...yu5CSpyHI</tronqu>
Mise en œuvre dans ASP.NET Core 5
1. Ajout du dépendance NuGet
Microsoft.AspNetCore.Authentication.JwtBearer
2. Configuraton des services
Intégrez la configuration JWT dans la méthode ConfigureServices du fichier Startup.cs :
services.AddAuthentication(config => {
config.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
config.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
config.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(config => {
config.SaveToken = true;
config.RequireHttpsMetadata = false;
config.TokenValidationParameters = new TokenValidationParameters {
ValidateIssuer = true,
ValidateAudience = true,
ValidAudience = "https://mondomaine.com",
ValidIssuer = "https://mondomaine.com",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("MaCleSecrete12345678901234567890"))
};
});
3. Activation du middleware d'authentification
Ajoutez ce code dans la méthode Configure :
app.UseAuthentication();
4. Création d'un contrôleur pour générer les jetons
[Route("api/securite")]
public class SecuriteController : ControllerBase
{
[HttpPost("acces")]
public IActionResult ObtenirJeton([FromBody] IdentifiantsUtilisateur credentials)
{
// Vérification des identifiants (logique à implémenter)
if (credentials.NomUtilisateur != "utilisateur" || credentials.MotDePasse != "motdepasse")
return Unauthorized();
var revendications = new[] {
new Claim(JwtRegisteredClaimNames.Sub, credentials.NomUtilisateur),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var clesSecurisee = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("MaCleSecrete12345678901234567890"));
var credentiel = new SigningCredentials(clesSecurisee, SecurityAlgorithms.HmacSha256);
var jeton = new JwtSecurityToken(
issuer: "https://mondomaine.com",
audience: "https://mondomaine.com",
expires: DateTime.UtcNow.AddMinutes(90),
claims: revendications,
signingCredentials: credentiel
);
return Ok(new {
jetonAcces = new JwtSecurityTokenHandler().WriteToken(jeton),
dateExpiration = jeton.ValidTo
});
}
}
5. Protection des endpoints
Appliquez l'attribut [Authorize] aux contrôleurs ou actions devant restreindre l'accès aux utilisateurs authentifiés.