.net core使用jwt自动续期
程序员文章站
2023-11-08 15:48:46
小弟不C才,最近看了下网上的jwt方案,于是自己写了一个简单的jwt方案和大家分享下,希望大家给点意见! 假如有一个读书网站,可以不用登陆就访问,当需要自己写文章的时候就必须登录,并且登录之后如果一段时间内没有访问,则过期了需要重新登录。有效期内有登录则自动续期,所以我想使用中间件来负责token的 ......
小弟不c才,最近看了下网上的jwt方案,于是自己写了一个简单的jwt方案和大家分享下,希望大家给点意见!
假如有一个读书网站,可以不用登陆就访问,当需要自己写文章的时候就必须登录,并且登录之后如果一段时间内没有访问,则过期了需要重新登录。有效期内有登录则自动续期,所以我想使用中间件来负责token的更新以及删除。如下部分代码:
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));
}
然后前端可以根据响应结果来判断是否跳到登录页。
上一篇: 注解在Java中是如何工作的?
下一篇: 但如果是辣椒呢
推荐阅读
-
ASP.NET Core静态文件使用教程(9)
-
详解在ASP.NET Core中使用Angular2以及与Angular2的Token base身份认证
-
详解如何在ASP.NET Core中使用Redis
-
ASP.NET Core使用GraphQL第二章之中间件
-
ASP.NET Core使用GraphQL第一章之Hello World
-
.net core ajax使用EPPlus上传excle导入总结
-
.Net Core API使用ODP.NET操作Oracle数据库
-
【翻译】使用WebApi和Asp.Net Core Identity 认证 Blazor WebAssembly(Blazor客户端应用)
-
在Asp.Net或.Net Core中配置使用MarkDown富文本编辑器有开源模板代码(代码是.net core3.0版本)
-
ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用