public async Task <Result <UserPrivateDataDto> > UpdateRedisCache(string id, string email)
        {
            List <RefreshTokensModel> queryTokens = new List <RefreshTokensModel>();
            RedisSecurityModel        model       = null;
            var tokens = await _redisCache.GetSringValue(id);

            if (!String.IsNullOrEmpty(tokens))
            {
                model = JsonConvert.DeserializeObject <RedisSecurityModel>(tokens);
                if (model.Block)
                {
                    return(_result.Create <UserPrivateDataDto>(true, _errors.NotAuthorized, null));
                }

                queryTokens = model.Tokens;
            }
            else
            {
                model = new RedisSecurityModel();
            }

            var refreshToken       = _crypto.GetRandomNumber();
            var RefreshTokenHashed = _crypto.GetStringSha256Hash(refreshToken + _settings.SecretKey);

            createRefreshToken(id, queryTokens, RefreshTokenHashed);

            model.Tokens = queryTokens;
            var jsonString = JsonConvert.SerializeObject(model);

            await _redisCache.SetStringValue(id, jsonString);

            var dto = new UserPrivateDataDto();

            dto.Id         = id;
            dto.Email      = email;
            dto.Token      = refreshToken;
            dto.Scopes     = model.Scopes;
            dto.Tenants    = model.Tenants;
            dto.ValidEmail = model.ValidEmail;

            return(_result.Create(true, "", dto));
        }
        private async Task <Result <UserPrivateDataModel> > ValidRefreshToken(string token, string refreshToken)
        {
            var principal = _tokens.ValidateToken(token, false);
            var id        = principal.FindFirst(ClaimTypes.NameIdentifier).Value;

            List <RefreshTokensModel> queryToken = null;
            UserPrivateDataModel      model      = null;
            RedisSecurityModel        modelRedis = null;
            var block = false;

            if (!_settings.RedisCacheSecurity)
            {
                var result = await _services.GetSecrets(id);

                if (!result.Success)
                {
                    return(_result.Create <UserPrivateDataModel>(false, result.Message, null));
                }

                block = result.Value.Block;

                queryToken = result.Value.RefreshTokens;
                model      = result.Value;
            }
            else
            {
                var email  = principal.FindFirst(ClaimTypes.Email).Value;
                var tokens = await _redisCache.GetSringValue(id);

                if (String.IsNullOrEmpty(tokens))
                {
                    return(_result.Create <UserPrivateDataModel>(false, _errors.NotAuthorized, null));
                }

                modelRedis = JsonConvert.DeserializeObject <RedisSecurityModel>(tokens);

                block      = modelRedis.Block;
                queryToken = modelRedis.Tokens;

                model            = new UserPrivateDataModel();
                model.id         = id;
                model.Email      = email;
                model.Scopes     = modelRedis.Scopes;
                model.Tenants    = modelRedis.Tenants;
                model.ValidEmail = modelRedis.ValidEmail;
            }

            var coderefreshToken = _crypto.GetStringSha256Hash(refreshToken + _settings.SecretKey);
            var idx = queryToken.FindIndex((e) => e.Token == coderefreshToken);

            if (idx < 0)
            {
                return(_result.Create <UserPrivateDataModel>(false, _errors.NotAuthorized, null));
            }
            else
            {
                queryToken.RemoveAt(idx);
                if (!_settings.RedisCacheSecurity)
                {
                    model.RefreshTokens = queryToken;
                    await _services.Update(model);
                }
                else
                {
                    modelRedis.Tokens = queryToken;
                    var jsonString = JsonConvert.SerializeObject(modelRedis);
                    await _redisCache.SetStringValue(model.id, jsonString);

                    model.RefreshTokens = queryToken;
                }
            }

            if (block)
            {
                return(_result.Create <UserPrivateDataModel>(false, _errors.NotAuthorized, null));
            }


            return(_result.Create(true, "", model));
        }