web-dev-qa-db-fra.com

Pourrions-nous détruire / invalider le jeton JWT dans Asp.NET Core?

J'utilise ASP.NET Core & ASP.NET core Identity pour générer un jeton JWT.

Du côté client, mon API d'appel d'application react (SPA) pour créer le jeton, puis inclure Authorization: BearertokenFromApi dans les sous-demandes.

Lorsque je veux me déconnecter, comment puis-je expirer immédiatement le jeton côté serveur?

Actuellement, je supprime simplement le jeton bear côté client et non inclus dans la prochaine demande?

Référence : https://blogs.msdn.Microsoft.com/webdev/2017/04/06/jwt-validation-and- autorisation-dans-asp-net-core /


Code dans Configure section dans Startup.cs

app.UseJwtBearerAuthentication(new JwtBearerOptions
{
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    TokenValidationParameters = new TokenValidationParameters
    {
        ValidIssuer = "MySite",
        ValidAudience = "MySite",
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("VERYL0NGKEYV@LUETH@TISSECURE")),
        ValidateLifetime = true
    }
});

API pour créer un jeton

[HttpPost("Token")]
public async Task<IActionResult> CreateToken([FromBody] LoginModel model)
{
    try
    {
        var user = await userManager.FindByNameAsync(model.Email);
        if (passwordHasher.VerifyHashedPassword(user, user.PasswordHash, model.Password) == PasswordVerificationResult.Success)
        {

            var claims = new[]
            {
                new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                new Claim(JwtRegisteredClaimNames.Email, user.Email)
            };

            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("VERYL0NGKEYV@LUETH@TISSECURE"));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var token = new JwtSecurityToken(
                "MySite",
                "MySite",
                claims,
                expires: DateTime.UtcNow.AddMinutes(45),
                signingCredentials: creds);

            return Ok(new
            {
                Token = new JwtSecurityTokenHandler().WriteToken(token),
                Expiration = token.ValidTo,
            });
        }
        return BadRequest();
    }
    catch (Exception ex)
    {
        logger.LogError(ex.ToString());
        return StatusCode((int)HttpStatusCode.InternalServerError);
    }
}
11
Hung Quach

Vous ne pouvez pas le faire expirer facilement sans perdre certains de ses avantages ou rendre la solution beaucoup plus complexe.

Le meilleur pari est de raccourcir le temps du jeton d'accès (<= 5 minutes) et le jeton d'actualisation.

Mais si vous voulez vraiment l'invalider immédiatement, vous aurez besoin de quelques choses:

  1. Mettre en cache l'ID du jeton une fois le jeton créé avec une durée aussi longue que le délai d'expiration du jeton (accès et rafraîchissement du jeton)
  2. [Si ferme/plusieurs instances] Vous devez le mettre en cache dans un cache distribué, comme redis
  3. [Si ferme/plusieurs instances] Vous devez le propager via le bus de messages (c.-à-d. En utilisant Redis, RabbitMQ ou Azure Message Bus) vers chaque instance de votre application, afin qu'ils puissent le stocker dans un cache de mémoire locale (vous n'avez donc pas pour avoir un appel réseau, chaque fois que vous voulez le valider)
  4. Lors de l'autorisation, vous devez valider si l'ID se trouve toujours dans le cache; sinon, refusez l'autorisation (401)
  5. Lorsque l'utilisateur se déconnecte, vous devez supprimer votre élément du cache.
  6. [Si ferme/plusieurs instances] Supprimez l'élément du cache distribué et envoyez un message à toutes les instances afin qu'elles puissent le supprimer de leur cache local

D'autres solutions ne nécessitant pas de bus de messages/cache distribuable nécessiteraient de contacter le serveur d'authentification à chaque demande, ce qui détruirait le principal avantage d'un jeton JWT.

Le principal avantage de JWT est qu'il est autonome et qu'un service Web n'a pas besoin d'appeler un autre service pour le valider. Il peut être validé localement en validant la signature (puisque le jeton ne peut pas être modifié par l'utilisateur sans invalider la signature) et le temps d'expiration/audience auquel le jeton est destiné.

12
Tseng