Пример #1
0
        public async Task <ApiResponse <LoginDetail> > AuthenticateUser(UserLogin model)
        {
            var response = new ApiResponse <LoginDetail>();

            var userDetail = _userRepo.List(i => i.Email == model.Email).FirstOrDefault();
            var loginLog   = new Entity.LoginLog(model.IpAddress);

            if (userDetail != null && !userDetail.IsActive)
            {
                response.Success = false;
                response.ErrorMesssage.Add(MtsResource.AccountLocked);
                loginLog.Success = false;
            }

            if (response.Success)
            {
                if (userDetail == null || !_crypto.CheckMatch(userDetail.Password, model.Password))
                {
                    response.Success = false;
                    response.ErrorMesssage.Add(MtsResource.EmailPasswordNotFound);
                    if (userDetail != null)
                    {
                        loginLog.Success       = false;
                        loginLog.UserId        = userDetail.Id;
                        userDetail.ErrorCount += 1;
                        if (userDetail.ErrorCount == _config.MaxLoginErrorCount)
                        {
                            await DeactivateUser(userDetail);
                        }
                    }
                }
                if (response.Success)
                {
                    var userBusiness = _userBusinessRepo.List(i => i.UserId == userDetail.Id).FirstOrDefault();
                    if (userBusiness != null)
                    {
                        string chip = $"{model.Email}:{model.Password}";
                        loginLog.UserId       = userDetail.Id;
                        userDetail.ErrorCount = 0;
                        await _userRepo.Update(userDetail);

                        response.DataResponse = new LoginDetail()
                        {
                            BusinessId   = userBusiness.BusinessId,
                            Id           = userDetail.Id,
                            Name         = $"{userDetail.FirstName} {userDetail.LastName}",
                            RefreshToken = $"{_crypto.EncryptString(chip, _config.EncryptionKey)}.{_crypto.CalculateHash(chip)}",
                            AccessToken  = RandomGenerator.GenerateString(16)
                        };
                    }
                    else
                    {
                        response.Success = false;
                        response.ErrorMesssage.Add(MtsResource.EmailPasswordNotFound);
                    }
                }
            }

            await _loginLogRepo.Save(loginLog);

            return(response);
        }