.net core使用jwt自动续期
小弟不C才,最近看了下网上的jwt方案,于是自己写了一个简单的jwt方案和大家分享下,希望大家给点意见!
假如有一个读书网站,可以不用登陆就访问,当需要自己写文章的时候就必须登录,并且登录之后如果一段时间内没有访问,则过期了需要重新登录。有效期内有登录则自动续期,所以我想使用中间件来负责token的更新以及删除。如下部分代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | public async Task InvokeAsync(HttpContext context) { try { bool isExpires = context.Request.Headers.TryGetValue( "isExpires" , out StringValues expires); bool IsAuthorized = context.Request.Headers.TryGetValue( "Authorization" , out StringValues authStr); string token = authStr.ToString().Substring( "Bearer " .Length).Trim(); //每次访问都更新token有效期 new JWT(_cacheClient).RefreshToken(token, isExpires); context.Response.Headers.Add( "refreshTokne" , token); } catch (ValidationException) { if (context.Request.Path.Value.Contains( "api/auth/islogin" )) { context.Response.ContentType = "text/plain" ; await context.Response.WriteAsync( "not login" ); } } await _next(context); } /// <summary> /// 生成jwtToken,有效期30分钟 /// </summary> /// <param name="claims"></param> /// <returns></returns> public static string CreateToken(IEnumerable<Claim> claims) { var key = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(SecurityKey)); var expires = DateTime.Now.AddMinutes(30); var token = new JwtSecurityToken( issuer: issuer, audience: audience, claims: claims, notBefore: DateTime.Now, expires: expires, signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature)); string jwtToken = new JwtSecurityTokenHandler().WriteToken(token); return jwtToken; } /// <summary> /// 更新token,先通过前端传过来的token从redis里取出jwt,如果为null,则表 ///示过期或未登录,如果jwt过期,则更新jwt,并且通过中间件把新的token放到响应头里返回前端。 /// </summary> /// <param name="token">token</param> /// <param name="isExpires">是否失效</param> public void RefreshToken( string token, bool isExpires= false ) { TokenModel tokenMode = _cacheClient.Get<TokenModel>(token); if (tokenMode == null ) throw new ValidationException( "expires" ); JwtSecurityToken jwtSecurityToken= new JwtSecurityTokenHandler().ReadJwtToken(token); if (isExpires) token = CreateToken(jwtSecurityToken.Claims); tokenMode.ExpireTime = tokenMode.ExpireTime.AddDays(7); if (tokenMode.ExpireTime.Day-DateTime.Now.Day==1) //实现最后一天如果访问了就自动续期 _cacheClient.Set(token, tokenMode, TimeSpan.FromDays(7)); } |
然后前端可以根据响应结果来判断是否跳到登录页。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!