Intégration de l'authentification JWT dans ASP.NET Core 5

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.

Étiquettes: JWT ASP.NET Core authentication authorization .NET 5

Publié le 27 juin à 04h10