加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

身份验证 – 我们可以在Asp.NET Core中销毁/无效JWT令牌吗?

发布时间:2020-12-16 06:50:49 所属栏目:asp.Net 来源:网络整理
导读:我使用ASP.NET Core ASP.NET核心标识生成JWT标记. 在客户端,我的react(SPA)app调用API来创建令牌,然后在子请求中包含Authorization:Bearer tokenFromApi. 当我想注销时如何立即使服务器端的令牌过期? 目前我只删除客户端的熊牌,而不包含在下一个请求中?
我使用ASP.NET Core& ASP.NET核心标识生成JWT标记.

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

当我想注销时如何立即使服务器端的令牌过期?

目前我只删除客户端的熊牌,而不包含在下一个请求中?

参考: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,持续时间与令牌的到期时间(访问和刷新令牌)一样长
> [If Farm / multiple instances]您需要将其缓存在分布式缓存中,例如redis
> [If Farm / multiple instances]您需要通过消息总线(即使用Redis,RabbitMQ或Azure消息总线)将其传播到应用程序的每个实例,以便将它们存储在本地内存缓存中(因此您不需要必须有一个网络电话,每次你想验证它)
>在授权期间,您需要验证ID是否仍在缓存中;如果没有,拒绝授权(401)
>当用户注销时,您需要从缓存中删除您的项目.
> [If Farm / multiple instances]从分布式缓存中删除项目并向所有实例发送消息,以便他们可以从本地缓存中删除它

其他不需要消息总线/可分发缓存的解决方案需要在每个请求上联系auth服务器,从而破坏了JWT令牌的主要优势.

JWT的主要优点是它们是自包含的,并且Web服务不必调用另一个服务来验证它.它可以通过验证签名在本地进行验证(因为用户无法更改令牌,无法使签名无效)以及令牌所针对的到期时间/受众.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读