简书链接:aspnetcore过期时间等问题探索
文章字数:516,阅读全文大约需要2分钟
不能马上测试的的问题
我尝试设置15秒时效,发现等了几分钟也没失效
需要覆盖默认值ClockSkew 改成0 就能立马测试出来了。

1
2
3
4
5
6
7
8
9
10
11
12
options.TokenValidationParameters = new TokenValidationParameters
{
//NameClaimType = JwtClaimTypes.Name,
//RoleClaimType = JwtClaimTypes.Role,
ValidateIssuer = true, //是否验证Issuer
ValidateAudience = true, //是否验证Audience
ValidateLifetime = true, //是否验证失效时间
RequireExpirationTime = true, //过期时间
ValidateIssuerSigningKey = true, //是否验证IssuerSigningKey
ValidAudience = audience,
ValidIssuer = issuer,
ClockSkew = TimeSpan.Zero,//方便立马测试是否错误

失效的处理。。

如果刚刚失效,代表用户此时是在线的,直接掉线有点太草率了。。
要设置距离那个时间应该有50分钟才算彻底掉线。
我的解决思路:
登录的时候返回一个过期时间,app每次发起请求判断是否快失效,快失效则重新访问接口获取token,而获取这个token恰好需要token验证也就是加上[Auth],只是刚好差一点点失效,
获取到了之后用新的token访问即可
总结:
临时在线失效 2小时,在这快到期范围内如果再次请求,那么再次刷新,token失效将又会被更新为3天。
长token失效3天。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[HttpGet("refreshToken")]
[Authorize]
public string refreshToken(string username)
{
string SecurityKey = mIConfiguration["SecurityKey"];
string issuer = mIConfiguration["issuer"];
string audience = mIConfiguration["audience"];
string tokenTime = "";
JObject obj = new JObject();
obj.Add("token", "Bearer " + AuthBiz.getTokenCustromTime(SecurityKey, issuer, audience, name: username, tokenTime: out tokenTime, dateTime: DateTime.Now.AddDays(3)));
obj.Add("tokenTime", tokenTime);
obj.Add("code", 0);
return obj.ToString();

}

app客户端的处理
全局拦截请求,首先调用isNeedRefreshToken判断是否需要刷新,如果需要,刷新之后再请求需要请求的连接.

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
 public static boolean isNeedRefreshToken() {
if (!SuperContext.getInstance().isLogin()) {//如果没登录 直接登录好了,token都没得刷个锤子.
return false;
} else {
long expirationTime = SuperContext.getInstance().getSessionInfo().getExpirationTime();
if(expirationTime==0){
return false;//代表可能是未登录的时候发起的请求,登录后 时间不会大于0
}else{
long expirationTimeMinute= (long) (expirationTime/60f/60f);
long currentSecondMinute = (long) (System.currentTimeMillis()/60f/60f);
long distance=expirationTimeMinute-currentSecondMinute;
if(distance>0&&distance<120){//如果快过期但是还没过期 也就是再快过期的2小时内刷新都能进行延长token有效期.
return true;
}else{
return false;
}
}
}
}

protected Response getResponse(OkHttpClient.Builder builder) throws IOException {
if (BaseUtil.isNeedRefreshToken()) {//进行token刷新操作

try {
String url = String.format(Cns.REFRESH_TOKEN_URL, GlobalSettingModel.getInstance().getUrl_webapi(), AppUtils.encodeUrlParam(SuperContext.getUserName()), SuperContext.getInstance().getBuildTime());
Response response = HttpUtil.querySyncGetDataCancelable(url, builder.build(), getHeader(), null);
if (response.isSuccessful()) {
String string = response.body().string();
org.json.JSONObject jsonObject = new org.json.JSONObject(string);
String token = jsonObject.optString("token", SuperContext.getInstance().getSessionInfo().getToken());
long expirationTime = jsonObject.optLong("expirationTime", SuperContext.getInstance().getSessionInfo().getExpirationTime());
SuperContext.getInstance().getSessionInfo().setAccessToken(token);
SuperContext.getInstance().getSessionInfo().setExpirationTime(expirationTime);
} else {//忽略
}
} catch (Throwable e) {
//忽略
}
}
return HttpUtil.querySyncGetDataCancelable(getUrl(), builder.build(), getHeader(), requestPair);
// return HttpUtil.querySyncPostDataCancelable(getUrl(), builder.build(), getHeader(), requestPair);
}

网上也有其他办法,说什么用双token,在客户端已经进行403的时候使用返回的刷新token再进行一些刷新token操作,这种方法属于明知道失效了但是先失效然后再进行访问。。我还是喜欢我这种方式。。