简书链接: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操作,这种方法属于明知道失效了但是先失效然后再进行访问。。我还是喜欢我这种方式。。