我们可以在Asp.NET Core中销毁JWT令牌吗?

我使用ASP.NET Core&ASP.NET核心身份来生成JWT令牌。

在客户端,我的反应(SPA)应用程序调用API来创建令牌,然后在子请求中包含Authorization: Bearer tokenFromApi

当我想注销时,我该如何立即使服务器端的令牌失效?

目前我只是在客户端删除了bear标记,并且未包含在下一个请求中?

参考 :https://blogs.msdn.microsoft.com/webdev/2017/04/06/jwt-validation-and-authorization-in-asp-net-core/


Startup.cs中的Configure部分中的代码

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来创建令牌

[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);
    }
}

你不能轻易过期,不会失去它的某些优点或使解决方案显得更复杂。

最好的办法是让访问令牌的时间足够短(<= 5分钟),刷新令牌长时间运行。

但是,如果你真的想立即失效,你需要做一些事情:

  • 只要令牌的有效期(包括访问和刷新令牌)持续一段时间,创建令牌时缓存令牌的ID,
  • [如果服务器场/多个实例]您需要将其缓存在分布式缓存中,如redis
  • [如果农场/多个实例]您需要通过消息总线(即使用Redis,RabbitMQ或Azure消息总线)将它传播到您的应用程序的每个实例,以便它们可以将其存储在本地内存缓存中(因此您没有有网络电话,每次你想验证它)
  • 在授权期间,您需要验证ID是否仍在缓存中; 如果不是,拒绝授权(401)
  • 当用户注销时,您需要从缓存中移除项目。
  • [如果Farm / multiple instances]从分布式缓存中删除项目并向所有实例发送消息,以便它们可以从其本地缓存中删除它
  • 其他不需要消息总线/可分发缓存的解决方案需要在每个请求中联系auth服务器,从而消除了JWT令牌的主要优势。

    JWT的主要优势在于它们是独立的,Web服务不必调用其他服务来验证它。 它可以通过验证签名进行本地验证(因为令牌不能被用户改变而不会使签名无效)和令牌所指定的到期时间/受众。

    链接地址: http://www.djcxy.com/p/22433.html

    上一篇: Could we destroy JWT token in Asp.NET Core?

    下一篇: Asp.net core Identity and Token Based Authetication