ASP.NET Core 自动刷新JWT Token

前言

为了安全性考虑,我们可以设置JWT Token较短的过期时间,但是这样会导致客户端频繁地跳到登录界面,用户体验不好。正常解决办法是增加refresh_token,客户端使用refresh_token去主动刷新JWT Token。这里介绍一种变通的方式,自动刷新JWT Token。

原理

我们读取每个请求的Authorization头,获得当前请求的JWT Token。检查当前token的过期时间,如果在30分钟以内,那么我们就生成一个具有新过期时间的JWT Token,并通过X-Refresh-Token头返回。客户端检查到X-Refresh-Token头,就将保存的JWT Token替换掉,下次发送请求就是用最新的token了。

实现

创建一个Middleware,它的作用是检查JWT Token过期时间并生成新token返回:

 public async Task InvokeAsync(HttpContext context, RequestDelegate _next)
  {
            JwtSecurityToken token = null;
            string authorization = context.Request.Headers["Authorization"];

            if (!string.IsNullOrEmpty(authorization) && authorization.StartsWith("Bearer "))
            {
                token = new JwtSecurityTokenHandler().ReadJwtToken(authorization.Substring("Bearer ".Length));
            }
            //刷新Token  
            if (token != null && token.ValidTo > DateTime.UtcNow && token.ValidTo.AddMinutes(-30) <= DateTime.UtcNow)
            {
                context.Response.Headers.Add("X-Refresh-Token", await RefreshTokenAsync(token));
            }

            await _next(context);
   }

结论

当然,推荐大家尽量使用refresh_token的方式,毕竟这样安全性会更高一些。

posted @ 2022-09-20 17:25  进步者One  阅读(604)  评论(0编辑  收藏  举报