Owin Token即使在与服务器连续活动后也会过期

时间:2015-03-19 09:43:19

标签: c# authentication asp.net-web-api asp.net-web-api2 owin

您好我正在创建一个应用程序,我使用Owin Tokens来验证用户权限和授权。

我可以生成令牌,并按预期设置到期时间。

问题

如果我将此令牌的到期时间设置为30分钟,并且用户处于非活动状态直到25分钟并且在第26分钟他开始使用该应用程序,并且在工作中间,在第30分钟,令牌将过期并且所有数据可能会丢失。

如何保持令牌有效,就像我们的表单身份验证一样,它将在30分钟不活动后过期。 ?

public void Configuration(IAppBuilder app)
    {
        ConfigureOAuth(app);
    //Rest of code is here;
    }

    public void ConfigureOAuth(IAppBuilder app)
    {
        OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
            Provider = new SimpleAuthorizationServerProvider()
        };

        // Token Generation
        app.UseOAuthAuthorizationServer(OAuthServerOptions);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

    }

1 个答案:

答案 0 :(得分:2)

我在申请中所做的事情:

当应用程序启动时,它会检查

  1. 如果“过期日期 - 30秒”<现在比刷新令牌和更新过期日期。执行第2步
  2. 在“过期日期 - 30秒 - 现在”秒内重新安排refreshTokenIfNeededfunction
  3. 样品:

    public refreshTokenIfNeeded(): void {
    
       var self = this;
    
       var tokenHolder = self.tokenService.getToken();
       if (tokenHolder == null || !tokenHolder.refreshToken) {
          self.logout();
          return;
       }
    
       var expireTimeInMiliseconds = (new Date(tokenHolder.expirationTime).getTime() - 30000 - new Date().getTime());
       if (expireTimeInMiliseconds > 0) {
          setTimeout(() => self.refreshTokenIfNeeded(), expireTimeInMiliseconds);
          return;
       }
    
       var data = "grant_type=refresh_token&refresh_token=" + tokenHolder.refreshToken + "&client_id=" + self.externalAuthService.getClientId();
    
       self.$http.post('/token', data, {
             headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
             }
          })
          .success((response: ILoginTokenResponse) => {
             self.persist(response);
    
             setTimeout(() => self.refreshTokenIfNeeded(), (response.expires_in - 30) * 1000);
    
          }).error(() => {
             this.logout();
          });
    }