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: Bearer
tokenFromApi
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);
}
}
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:
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é.