Exemplo n.º 1
0
        public ServiceResponse <ExchangeModel> GetAllExchange()
        {
            var response = new ServiceResponse <ExchangeModel>(null);
            //Check Redis
            var cacheKey = "AllExchange";
            var result   = _redisCacheManager.Get <List <ExchangeModel> >(cacheKey);

            //-------------------------------
            if (result != null)
            {
                response.List = result;
                return(response);
            }
            else
            {
                var exchangeResult = _context.Exchange.ToList();
                if (exchangeResult != null)
                {
                    var model = _mapper.Map <IList <ExchangeModel> >(exchangeResult);
                    response.List         = model;
                    response.IsSuccessful = true;
                    _redisCacheManager.Set(cacheKey, response.List, DateTime.Now.AddMinutes(1));
                }

                return(response);
            }
        }
Exemplo n.º 2
0
        public ServiceResponse <EmployeesModel> SearchEmployees(string lastName, int pageNo, int pageSize)
        {
            lastName = string.IsNullOrWhiteSpace(lastName) ? string.Empty : lastName.ToLower(CultureInfo.CurrentCulture);

            //Check Redis
            var cacheKey = string.Format(CacheKeys.EmployeeList, lastName, pageNo, pageSize);
            var result   = _redisCacheManager.Get <IList <EmployeesModel> >(cacheKey);

            //-------------------------------
            if (result != null)
            {
                var response = new ServiceResponse <EmployeesModel>(null);
                response.List = result;
                return(response);
            }
            else
            {
                var query = _employeesRepository.Table
                            .Where(k => EF.Functions.Like(k.LastName ?? string.Empty, $"%{lastName}%"))
                            .OrderBy(c => c.EmployeeId)
                            .Skip(pageNo * pageSize)
                            .Take(pageSize)
                            .ToList();
                var response = new ServiceResponse <EmployeesModel>(null);
                var models   = _mapper.Map <List <EmployeesModel> >(query);
                response.List = models;
                _redisCacheManager.Set(cacheKey, response.List);
                return(response);
            }
        }
Exemplo n.º 3
0
        //Burada 3 yerde geçtiği için Extract Function() olarak dışarı alınmıştır. Amaç RefreshToken kontrolü ile platforma göre yeni Tokenların oluşturulmasıdır.
        public void CreateTokensByCheckRefreshToken(ActionExecutingContext context, bool returnResult = false)
        {
            if (context.HttpContext.Request.Headers["RefreshToken"].FirstOrDefault() != null) // client refresh token göndermiş.
            {
                bool.TryParse(context.HttpContext.Request.Headers["IsMobile"].FirstOrDefault(), out var isMobile);
                int.TryParse(context.HttpContext.Request.Headers["UserId"].FirstOrDefault(), out var userId);
                var unqDeviceId = context.HttpContext.Request.Headers["UnqDeviceId"].FirstOrDefault();
                if (userId == 0)
                {
                    context.Result = new UnauthorizedResult();
                    return;
                }

                var clientRefreshToken = context.HttpContext.Request.Headers["RefreshToken"].FirstOrDefault();
                var redisRefreshToken  = _redisCacheService.Get <string>(_redisCacheService.GetTokenKey(userId, isMobile, true, unqDeviceId));

                if (string.IsNullOrEmpty(redisRefreshToken))//rediste refresh token yok
                {
                    context.Result = new UnauthorizedResult();
                    return;
                }
                var decClientRefreshToken = _encryptionService.DecryptText(clientRefreshToken);
                if (decClientRefreshToken == redisRefreshToken)//Refresh Token doğru. Yeni token ve refresh token üretip dönelim.
                {
                    UserModel user = _userService.GetById(userId).Entity;
                    var(encToken, decToken) = _encryptionService.GenerateToken(user.Email);
                    //Oluşturulan Token Redis'e atılır.

                    var      createTime      = DateTime.Now;
                    DateTime tokenExpireTime = createTime.AddMinutes(_coreContext.TokenExpireTime);
                    _redisCacheService.Set(_redisCacheService.GetTokenKey(userId, isMobile, false, unqDeviceId), decToken, tokenExpireTime);

                    //Geri dönülecek Encrypt Token ve Yaratılma zamanı Client'ın Header'ına atanır
                    context.HttpContext.Items["token"]            = encToken;
                    context.HttpContext.Items["createdTokenTime"] = createTime.GetTotalMilliSeconds();

                    //RefreshToken Oluşturulur.
                    //Refresh Token Mobilde 1 Yıl Web'de 1.5 saattir. appsettings.json'a bakınız.
                    var refreshToken = GenerateRefreshToken(user, context, unqDeviceId, isMobile);
                    if (!string.IsNullOrWhiteSpace(refreshToken))
                    {
                        //Oluşturulan RefreshToken Client'a dönülür.
                        context.HttpContext.Items["refreshToken"] = refreshToken;
                    }
                }
                else if (returnResult)
                {
                    context.Result = new UnauthorizedResult();
                    return;
                }
            }
            else if (returnResult)
            {
                context.Result = new UnauthorizedResult();
                return;
            }
        }
        public IEnumerable <ValueModel> Get()
        {
            if (!_redisCacheService.TryGetValue(key: ValuesCacheKeyTemplate.AllValuesCacheKey, result: out IEnumerable <ValueModel> values))
            {
                values = _values;//get data from db instead
                _redisCacheService.Set(key: ValuesCacheKeyTemplate.AllValuesCacheKey, data: values, cacheTimeInMinutes: 1);
            }

            return(values);
        }
Exemplo n.º 5
0
        public IEnumerable <EmployeeDto> spRedisTry()
        {
            if (!_redisCacheService.TryGetValue(key: "carkey", result: out IEnumerable <EmployeeDto> values))
            {
                values = EmployeeFactory.Create();//get data from db instead
                _redisCacheService.Set(key: "carkey", data: values, cacheTimeInMinutes: 60);
            }

            return(values);
        }
Exemplo n.º 6
0
        public ViewProduct GetProductById(int Id)
        {
            //Check Redis
            var cacheKey = string.Format(ProductDetail, Id);
            var result   = _redisCacheManager.Get <ViewProduct>(cacheKey);

            //-------------------------------

            if (result != null)
            {
                return(result);
            }
            else
            {
                var data  = _productRepository.GetById(Id, true);
                var model = _mapper.Map <ViewProduct>(data);
                _redisCacheManager.Set(cacheKey, model);
                return(model);
            }
        }
Exemplo n.º 7
0
        /// <summary>
        ///     Get a cached item. If it's not in the cache yet, then load and cache it
        /// </summary>
        /// <typeparam name="T">Type of cached item</typeparam>
        /// <param name="cacheManager">Cache manager</param>
        /// <param name="key">Cache key</param>
        /// <param name="cacheTime">Cache time in minutes (0 - do not cache)</param>
        /// <param name="acquire">Function to load item if it's not in the cache yet</param>
        /// <returns>Cached item</returns>
        public static T Get <T>(this IRedisCacheService cacheManager, string key, int cacheTime, Func <T> acquire)
        {
            //item already is in cache, so return it
            if (cacheManager.IsSet(key))
            {
                return(cacheManager.Get <T>(key));
            }

            //or create it using passed function
            var result = acquire();

            //and set in cache (if cache time is defined)
            if (cacheTime > 0)
            {
                cacheManager.Set(key, result, DateTime.Now.AddMinutes(cacheTime));
            }

            return(result);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Generate JWT Token
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public async Task <AuthenticateResponse> GenerateJwtToken(User user)
        {
            JwtSecurityTokenHandler tokenHandler = new();

            byte[] key = Convert.FromBase64String(_jwtSettings.Secret);

            SecurityTokenDescriptor tokenDescriptor = new()
            {
                Subject = new ClaimsIdentity(new[] {
                    new Claim("Id", user.Id.ToString()),
                    new Claim("Email", user.Email),
                }),
                TokenType          = "Bearer",
                Expires            = _jwtSettings.Seconds == 0 ? DateTime.UtcNow.AddDays(7) : DateTime.UtcNow.AddSeconds(_jwtSettings.Seconds), //If valid time is 0 token is valid for 7 days by default
                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
            };

            SecurityToken token = tokenHandler.CreateToken(tokenDescriptor);

            AuthenticateResponse authRepsonse = new AuthenticateResponse()
            {
                AccessToken  = tokenHandler.WriteToken(token),
                ExpiresIn    = token.ValidFrom.GetLifetimeInSeconds(token.ValidTo),
                Created      = token.ValidFrom,
                Expiration   = token.ValidTo,
                RefreshToken = await _cacheService.Set(new
                {
                    user.Id,
                    user.Email
                }, new DistributedCacheEntryOptions()
                {
                    AbsoluteExpiration = token.ValidTo
                })
            };

            return(authRepsonse);
        }
    }
Exemplo n.º 9
0
        public ServiceResponse <LoginResultModel> CheckLogin(LoginModel model)
        {
            var    isMobile = model.IsMobile;
            string decPassword;

            try
            {
                //Client'dan encrypted olarak gelen Password Decrypt edilir.
                //Example Password: vbt123456 ==> dmJ0MTIzNDU2
                decPassword = _encryptionService.DecryptFromClientData(model.Password);
            }
            catch
            {
                string message = "Şifre işleminde bir problem yaşandı lütfen teknik destek alın.";
                if (isMobile)
                {
                    message = "Lütfen mağazadan uygulamanın yeni versiyonunu indiriniz.";
                }
                var response = new ServiceResponse <LoginResultModel>(null);
                response.Entity = new LoginResultModel {
                    UserId = -2, ExceptionMessage = message
                };
                return(response);
            }
            var user = IsValidUserAndPasswordCombination(model.UserName, decPassword);

            if (user != null)
            {
                //Eğer Mobil ise
                if (model.IsMobile && !string.IsNullOrEmpty(model.UnqDeviceId))
                {
                    var loginedCount = (decimal)_redisCacheService.Count($"{user.Id}*");
                    //Aynı account ile En Fazla 2 Mobile Cihazın Girilmesine İzin Verilir.
                    if (loginedCount >= 2)
                    {
                        //Mobilden Login Olunmuş ise RefreshToken Her zaman Alınır (true)
                        var controlCacheKey = _redisCacheService.GetTokenKey(user.Id, isMobile, true, model.UnqDeviceId);
                        var controlKey      = _redisCacheService.Get <string>(controlCacheKey);

                        if (string.IsNullOrEmpty(controlKey))
                        {
                            var response2 = new ServiceResponse <LoginResultModel>(null);
                            response2.Entity = new LoginResultModel {
                                UserId = -1, ExceptionMessage = "En fazla 2 farklı mobil cihazdan giriş yapabilirsiniz."
                            };
                            return(response2);
                        }
                    }
                }
                //User Session'a Atılabilir. Sonradan Kullanmak için.
                ////3.1'de Destek Yok. HttpContext.Session.SetObject("User", user);

                var loginResultModel = new LoginResultModel
                {
                    UserName = user.UserName,
                    Name     = user.Name,
                    UserId   = user.Id,
                };

                //Token
                var(encToken, decToken) = _encryptionService.GenerateToken(user.Email);
                loginResultModel.Token  = encToken;

                var createTime = DateTime.Now;
                var cacheKey   = _redisCacheService.GetTokenKey(user.Id, isMobile, false, model.UnqDeviceId);
                _redisCacheService.Set(cacheKey, decToken, createTime.AddMinutes(_coreContext.TokenExpireTime));// 1 saatlik Token Açık Atılır.

                DateTime tokenExpireTime = createTime.AddMinutes(_coreContext.RefreshTokenExpireTime);
                if (isMobile)
                {
                    tokenExpireTime = createTime.AddMinutes(_coreContext.MobileRefreshTokenExpireTime);
                    //tokenExpireTime = createTime.AddDays(365);
                }
                //RefreshToken
                var refreshToken = _encryptionService.GenerateToken(user.Email);
                loginResultModel.RefreshToken = refreshToken.encToken;
                _redisCacheService.Set(_redisCacheService.GetTokenKey(user.Id, isMobile, true, model.UnqDeviceId), refreshToken.decToken, tokenExpireTime);

                loginResultModel.CreatedTokenTime = createTime.GetTotalMilliSeconds();
                var response = new ServiceResponse <LoginResultModel>(null);
                response.Entity = loginResultModel;
                return(response);
            }
            else
            {
                var loginResultModel = new LoginResultModel();
                var response         = new ServiceResponse <LoginResultModel>(null);
                response.Entity = loginResultModel;
                return(response);
            }
        }