ActionResult RegisterInternal(
            RegistrationViewModel registrationViewModel,
            string usernameTakenMessage,
            Func <string, User> createUser,
            Func <ActionResult> confirmAction,
            Func <ActionResult> invalidModelStateAction,
            Action <User> afterUserCreated = null)
        {
            if (registrationViewModel == null)
            {
                throw new ArgumentNullException("registrationViewModel");
            }
            if (createUser == null)
            {
                throw new ArgumentNullException("createUser");
            }
            if (confirmAction == null)
            {
                throw new ArgumentNullException("confirmAction");
            }
            if (invalidModelStateAction == null)
            {
                throw new ArgumentNullException("invalidModelStateAction");
            }

            if (ModelState.IsValid)
            {
                var conflictedUser = userService.GetUserByUserName(registrationViewModel.Email);
                if (conflictedUser != null)
                {
                    ModelState.AddModelError("Email", usernameTakenMessage);
                    return(invalidModelStateAction());
                }

                var hashedPassword = formsAuthenticationService.HashAndSalt(
                    registrationViewModel.Email,
                    registrationViewModel.Password);

                var user = createUser(hashedPassword);

                if (string.IsNullOrWhiteSpace(configuration.EmailSmtpServer))
                {
                    // if no smtp server configured, just activate user as no email is sent out.
                    user.Activate();
                }

                userService.SaveUser(user);

                if (afterUserCreated != null)
                {
                    afterUserCreated(user);
                }
                return(confirmAction());
            }

            return(invalidModelStateAction());
        }
        string GetNewPasswordFor(User user)
        {
            var newPassword    = Guid.NewGuid().ToString().Substring(0, 5);
            var hashedPassword = formsAuthenticationService.HashAndSalt(user.UserName, newPassword);

            user.ResetPassword(hashedPassword);
            return(newPassword);
        }
 private string GetHashedPassword(string password)
 {
     return(formsAuthenticationService.HashAndSalt(
                userService.CurrentUser.UserName,
                password));
 }