Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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);
        }