public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer,
                                                  bool isApproved, object providerUserKey, out MembershipCreateStatus status)
        {
            int questionId;

            if (_unitOfWork.SecurityQuestionsRepository.All().Any(x => x.Text == passwordQuestion))
            {
                var securityQuestion = _unitOfWork.SecurityQuestionsRepository.All().Single(x => x.Text == passwordQuestion);
                questionId = securityQuestion.Id;
            }
            else
            {
                var newQuestion = new SecurityQuestion
                {
                    Text = passwordQuestion
                };
                _unitOfWork.SecurityQuestionsRepository.Add(newQuestion);
                _unitOfWork.Commit();
                questionId = newQuestion.Id;
            }
            var defaultRoleId = _unitOfWork.RoleRepository.All().Where(x => x.Name == "Default" && x.SystemDefault).Select(x => x.Id).Single();
            var user          = new User
            {
                UserDetail = new UserDetail
                {
                    Username = username,
                    Email    = email
                },
                UserActivity = new UserActivity
                {
                    CreatedDate    = DateTime.Now,
                    IsApproved     = isApproved,
                    IsLockedOut    = false,
                    LastActiveDate = DateTime.Now
                },
                UserAndPassword = new UserAndPassword
                {
                    Password    = GetPasswordToStore(password),
                    LastChanged = DateTime.Now
                },
                UserSecurityQuestionAndAnswer = new UserSecurityQuestionAndAnswer
                {
                    Answer     = passwordAnswer,
                    QuestionId = questionId
                }
            };

            user.UserToRoles.Add(new UserToRole()
            {
                RoleId = defaultRoleId
            });
            _unitOfWork.UserRepository.Add(user);
            _unitOfWork.Commit();
            status = MembershipCreateStatus.Success;
            return(GetMembershipUserFromUser(user));
        }
        public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion,
                                                             string newPasswordAnswer)
        {
            var isValid = ValidateUser(username, password);

            if (!isValid)
            {
                return(false);
            }
            int questionId;

            if (_unitOfWork.SecurityQuestionsRepository.All().Any(x => x.Text == newPasswordQuestion))
            {
                var securityQuestion = _unitOfWork.SecurityQuestionsRepository.All().Single(x => x.Text == newPasswordQuestion);
                questionId = securityQuestion.Id;
            }
            else
            {
                var newQuestion = new SecurityQuestion
                {
                    Text = newPasswordQuestion
                };
                _unitOfWork.SecurityQuestionsRepository.Add(newQuestion);
                _unitOfWork.Commit();
                questionId = newQuestion.Id;
            }
            var userMembership = GetUser(username, false);

            if (userMembership?.ProviderUserKey == null)
            {
                return(false);
            }
            var userId = (int)userMembership.ProviderUserKey;
            var user   = _unitOfWork.UserRepository.All().Single(x => x.Id == userId);

            user.UserSecurityQuestionAndAnswer.QuestionId = questionId;
            user.UserSecurityQuestionAndAnswer.Answer     = newPasswordAnswer;
            _unitOfWork.Commit();
            return(true);
        }