asp.net core 过期时间等问题探索

不能马上测试的的问题
我尝试设置15秒时效,发现等了几分钟也没失效
需要覆盖默认值ClockSkew改成0 就能立马测试出来了。

   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天。

        [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判断是否需要刷新,如果需要,刷新之后再请求需要请求的连接.

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

你可能感兴趣的:(asp.net core 过期时间等问题探索)