private TokenCreateResult CreateToken(string userId, List <Claim> claims, string scheme) { var bearerParam = $"{userId}_{scheme}_bearer"; var refreshParam = $"{userId}_{scheme}_refresh"; var now = DateTime.Now; var token = new TokenModel() { Value = ApiTokenTools.CreateToken(bearerParam), CreateTime = now, Type = TokenType.Bearer, UserId = userId, Claims = claims, Expiration = now + _options.TokenExpire, Scheme = scheme }; var refreshToken = new TokenModel() { Value = ApiTokenTools.CreateToken(refreshParam), CreateTime = now, Type = TokenType.Refresh, UserId = userId, Claims = null, Expiration = now + _options.RefreshTokenExpire, Scheme = scheme }; return(TokenCreateResult.Success(token, refreshToken)); }
public virtual async Task <TokenCreateResult> RefreshAsync(string refreshToken, string scheme = null) { await InitializeAsync(scheme); var token = await _tokenStore.GetAsync(refreshToken, _innerScheme); if (token == null || token.Type != TokenType.Refresh) { return(TokenCreateResult.Failed("invalid refresh_token")); } if (!token.IsValid) { return(TokenCreateResult.Failed($"The refresh_token expired at '{token.Expiration.LocalDateTime.ToString(CultureInfo.InvariantCulture)}'")); } var claims = await GetUserClaimsAsync(token.UserId); var result = CreateToken(token.UserId, claims, _innerScheme); await _tokenStore.RemoveAsync(refreshToken, _innerScheme); if (_options.AllowMultiTokenActive && _options.KeepTokenValidTimeSpanOnRefresh != null) { var tokenList = await _tokenStore.GetListAsync(token.UserId, _innerScheme, TokenType.Bearer); var validTokenList = tokenList .Where(a => a.Expiration - DateTime.Now > _options.KeepTokenValidTimeSpanOnRefresh).ToList(); validTokenList.ForEach(a => a.Expiration = DateTime.Now + _options.KeepTokenValidTimeSpanOnRefresh.Value); foreach (var item in validTokenList) { await _cacheService.SetAsync(item); } await _tokenStore.UpdateListAsync(validTokenList); } await RemoveAllOldTokenAsync(token.UserId, _innerScheme); await _tokenStore.StoreAsync(new List <TokenModel>() { result.Bearer, result.Refresh }); if (_options.UseCache) { await _cacheService.SetAsync(result.Bearer); } return(result); }