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); } }
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); } }
//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); }
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); }
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); } }
/// <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); }
/// <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); } }
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); } }