public void Test_ChangePassword()
        {
            var customer = new Customer()
            {
                Username = "******",
                Email = "*****@*****.**",
                Membership = new Membership()
                {
                    Password = "******",
                    IsApproved = true
                }
            };
            var customerProvider = new Mock<ICustomerProvider>();
            customerProvider.Setup(it => it.QueryByUserName("test"))
                .Returns(customer);

            var customerService = new Mock<ICustomerService>();
            Customer updateCustomer = null;
            customerService.Setup(it => it.Update(It.IsAny<Customer>()))
                .Callback<Customer>((c) =>
                {
                    updateCustomer = c;
                });

            var passwordEncryptor = new Mock<IPasswordEncryptor>();
            passwordEncryptor.Setup(it => it.EncryptPassword(It.IsAny<string>(), It.IsAny<string>()))
                .Returns<string, string>((p, salt) => p);

            CustomerMembershipService customerMemberhipService = new CustomerMembershipService(
              customerProvider.Object, customerService.Object, passwordEncryptor.Object);

            ChangePasswordRequest request = new ChangePasswordRequest()
            {
                Username = "******",
                NewPassword = "******",
                OldPassword = "******"
            };
            var result = customerMemberhipService.ChangePassword(request);
            Assert.IsTrue(result.Success);
            Assert.IsNotNull(updateCustomer);
            Assert.AreEqual(request.Username, updateCustomer.Username);
            Assert.AreEqual(request.NewPassword, updateCustomer.Membership.Password);
        }
        private MembershipResult Validate(Customer customer, string password)
        {
            MembershipResult result = new MembershipResult();
            if (customer == null)
            {
                result.Errors.Add("Username and/or password are incorrect.".Localize());
            }

            else
            {
                if (customer.Membership.IsLockedOut || !customer.Membership.IsApproved)
                {
                    result.Errors.Add("Account was locked out or not approved.".Localize());
                }
                else
                {
                    var encryptedPwd = PasswordEncryptor.EncryptPassword(password, customer.Membership.PasswordSalt);
                    bool isValid = encryptedPwd == customer.Membership.Password;
                    if (isValid)
                    {
                        customer.Membership.UtcLastLoginDate = DateTime.UtcNow;
                        customer.Membership.FailedPasswordAttemptCount = 0;
                        CustomerService.Update(customer);
                    }
                    else
                    {

                        customer.Membership.FailedPasswordAttemptCount = customer.Membership.FailedPasswordAttemptCount + 1;
                        if (customer.Membership.FailedPasswordAttemptCount >= 5)
                        {
                            customer.Membership.IsLockedOut = true;
                        }

                        result.Errors.Add("Username and/or password are incorrect.".Localize());
                    }
                }

            }
            return result;
        }
        public MembershipResult Register(RegistrationRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }
            MembershipResult result = new MembershipResult();
            #region Validation
            if (string.IsNullOrEmpty(request.Username))
            {
                result.Errors.Add("Invalid username".Localize());
            }
            if (string.IsNullOrEmpty(request.Email) || !Regex.IsMatch(request.Email, Kooboo.RegexPatterns.EmailAddress))
            {
                result.Errors.Add("Invalid email.".Localize());
            }
            if (CustomerProvider.QueryByUserName(request.Username) != null)
            {
                result.Errors.Add("The username already exists.".Localize());
            }
            if (CustomerProvider.QueryByEmail(request.Email) != null)
            {
                result.Errors.Add("The email already exists.".Localize());
            }
            if (string.IsNullOrEmpty(request.Password))
            {
                result.Errors.Add("Invalid password.".Localize());
            }
            #endregion

            if (result.Success)
            {
                var passwordSalt = PasswordEncryptor.GenerateSalt();
                var encryptedPwd = PasswordEncryptor.EncryptPassword(request.Password, passwordSalt);
                var customer = new Customer()
                {
                    Username = request.Username,
                    Email = request.Email,
                    Membership = new Membership()
                    {
                        Password = encryptedPwd,
                        PasswordSalt = passwordSalt,
                        IsApproved = request.IsApproved,
                        UtcCreationDate = DateTime.UtcNow,
                        UtcLastActivityDate = DateTime.UtcNow
                    }
                };
                CustomerService.Add(customer);
            }

            return result;
        }
        public void Test_ValidateByUserName_Return_True()
        {
            var customer = new Customer()
                {
                    Username = "******",
                    Membership = new Membership()
                    {
                        IsLockedOut = false,
                        IsApproved = true,
                        Password = "******"
                    }
                };
            var customerProvider = new Mock<ICustomerProvider>();
            customerProvider.Setup(it => it.QueryByUserName("test"))
                .Returns(customer);
            var customerService = new Mock<ICustomerService>();
            var passwordEncryptor = new Mock<IPasswordEncryptor>();
            passwordEncryptor.Setup(it => it.EncryptPassword("test", null))
                .Returns("test");

            CustomerMembershipService customerMemberhipService = new CustomerMembershipService(
                customerProvider.Object, customerService.Object, passwordEncryptor.Object);

            Assert.IsTrue(customerMemberhipService.ValidateByUserName("test", "test").Success);

            Assert.AreEqual(0, customer.Membership.FailedPasswordAttemptCount);
        }
        public void Test_ValidateByUserName_PasswordInvalid_WithLockedOut()
        {
            var customer = new Customer()
               {
                   Username = "******",
                   Membership = new Membership()
                   {
                       IsLockedOut = false,
                       IsApproved = true,
                       Password = "******",
                       FailedPasswordAttemptCount = 4
                   }
               };
            var customerProvider = new Mock<ICustomerProvider>();
            customerProvider.Setup(it => it.QueryByUserName("test"))
               .Returns(customer);
            var customerService = new Mock<ICustomerService>();
            var passwordEncryptor = new Mock<IPasswordEncryptor>();

            CustomerMembershipService customerMemberhipService = new CustomerMembershipService(
                customerProvider.Object, customerService.Object, passwordEncryptor.Object);

            var result = customerMemberhipService.ValidateByUserName("test", "test");
            Assert.IsFalse(result.Success);
            Assert.AreEqual("Username and/or password are incorrect.", result.Errors[0]);

            Assert.AreEqual(5, customer.Membership.FailedPasswordAttemptCount);
            Assert.IsTrue(customer.Membership.IsLockedOut);
        }
        public void Test_ResetPassowrdResult_Invalid_Token()
        {
            var customer = new Customer()
            {
                Username = "******",
                Email = "*****@*****.**",
                Membership = new Membership()
                {
                    Password = "******",
                    IsApproved = true,
                    ResetPasswordToken = "123456"
                }
            };
            var customerProvider = new Mock<ICustomerProvider>();
            customerProvider.Setup(it => it.QueryByUserName("test"))
                .Returns(customer);

            var customerService = new Mock<ICustomerService>();
            Customer updateCustomer = null;
            customerService.Setup(it => it.Update(It.IsAny<Customer>()))
                .Callback<Customer>((c) =>
                {
                    updateCustomer = c;
                });

            var passwordEncryptor = new Mock<IPasswordEncryptor>();
            passwordEncryptor.Setup(it => it.EncryptPassword(It.IsAny<string>(), It.IsAny<string>()))
                .Returns<string, string>((p, salt) => p);

            CustomerMembershipService customerMemberhipService = new CustomerMembershipService(
              customerProvider.Object, customerService.Object, passwordEncryptor.Object);

            ResetPasswordRequest request = new ResetPasswordRequest()
            {
                Username = "******",
                NewPassword = "******",
                ResetPasswordToken = "abc123"
            };

            var result = customerMemberhipService.ResetPassowrd(request);
            Assert.IsFalse(result.Success);
            Assert.AreEqual("Invalid token.", result.Errors[0]);
            Assert.IsNull(updateCustomer);
        }