美文网首页
asp.net core 过期时间等问题探索

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

作者: 吉凶以情迁 | 来源:发表于2022-11-24 14:19 被阅读0次

    不能马上测试的的问题
    我尝试设置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 过期时间等问题探索

          本文链接:https://www.haomeiwen.com/subject/riyzxdtx.html