コード例 #1
0
ファイル: LoginService.cs プロジェクト: gurcanx/VbtTemplate
        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);
            }
        }