public async Task <User> Register(string email, string password)
        {
            var isPasswordValid = _hasNumber.IsMatch(password) && _hasUpperChar.IsMatch(password) && _hasMinimum8Chars.IsMatch(password);

            if (!isPasswordValid)
            {
                throw ExceptionFactory.SoftException(ExceptionEnum.PasswordNotValid, $"Password need to follow:\n\tMinimum 8 char\n\tHave at least one number\n\tHave upper char");
            }

            if (!_emailRegex.IsMatch(email))
            {
                throw ExceptionFactory.SoftException(ExceptionEnum.EmailFormatInvalid, $"Email {email} have wrong format");
            }

            if (_publicContext.User.FirstOrDefault(x => x.Email == email) != null)
            {
                throw ExceptionFactory.SoftException(ExceptionEnum.UserAlreadyExist,
                                                     $"User with email {email} already exist");
            }

            var confirmToken = new UserConfirmationToken()
            {
                ConfirmEmail = email,
                ConfirmId    = Guid.NewGuid(),
                IsActive     = true,
            };

            if (!await SendConfirmEmail(email, confirmToken.ConfirmId.ToString()))
            {
                throw ExceptionFactory.SoftException(ExceptionEnum.CantSendEmail,
                                                     $"Can't send confirmation email. Try later");
            }

            User userModel = new User()
            {
                Email        = email,
                UserSecurity = new UserSecurity()
                {
                    Password               = _passwordHasherService.Hash(password),
                    Role                   = await _publicContext.Role.FirstOrDefaultAsync(x => x.RoleName == "PreMember"),
                    IsConfirmed            = false,
                    UserConfirmationTokens = new List <UserConfirmationToken>()
                    {
                        confirmToken,
                    },
                },
            };

            await _publicContext.User.AddAsync(userModel);

            await _publicContext.SaveChangesAsync();

            return(userModel);
        }
Example #2
0
        public async Task <HttpResponseMessage> Post(CreateUser model)
        {
            if (!ModelState.IsValid)
            {
                return(Request.CreateErrorResponse(
                           HttpStatusCode.BadRequest, ModelState));
            }

            var email = model.Email.ToLower(CultureInfo.CurrentCulture);
            var requiresActivation = !IsDebuggingEnabled;

            try
            {
                var token = await membershipService.Signup(
                    email,
                    model.Password,
                    UserRoles.User,
                    requiresActivation);

                if (requiresActivation)
                {
                    var userConfirmationToken = new UserConfirmationToken
                    {
                        Email = email,
                        Token = token
                    };

                    var securedToken = urlSafeSecureDataSerializer.Serialize(
                        userConfirmationToken);

                    await mailer.UserConfirmationAsync(email, securedToken);
                }
                else
                {
                    await newUserConfirmedHandler.Handle(email);
                }

                return(Request.CreateResponse(HttpStatusCode.NoContent));
            }
            catch (IdentityException e)
            {
                ModelState.AddModelError(string.Empty, e);

                return(Request.CreateErrorResponse(
                           HttpStatusCode.BadRequest, ModelState));
            }
        }
Example #3
0
        public async Task <string> AddUserConfirmationTokenAsync(Guid userId, DateTime expirationDate)
        {
            await using var context = ContextFactory.CreateDataContext(null);
            var items = context.UserConfirmationTokens;

            var entity = new UserConfirmationToken()
            {
                Id     = Guid.NewGuid(),
                UserId = userId,
                ExpirationTimeStamp = expirationDate,
                Token  = Guid.NewGuid().ToString(),
                IsUsed = false
            };

            await items.AddAsync(entity).ConfigureAwait(false);

            await context.SaveChangesAsync().ConfigureAwait(false);

            return(entity.Token);
        }
Example #4
0
        public async Task <HttpResponseMessage> Post(CreateUser model)
        {
            if (!ModelState.IsValid)
            {
                return(Request.CreateErrorResponse(
                           HttpStatusCode.BadRequest, ModelState));
            }

            var statusCode = MembershipCreateStatus.Success;
            var userName   = model.Email.ToLowerInvariant();
            var token      = string.Empty;

            var requireConfirmation = !IsDebuggingEnabled;

            try
            {
                token = signup(userName, model.Password, requireConfirmation);
            }
            catch (MembershipCreateUserException e)
            {
                statusCode = e.StatusCode;
            }

            if (statusCode == MembershipCreateStatus.Success)
            {
                if (requireConfirmation)
                {
                    var userConfirmationToken = new UserConfirmationToken
                    {
                        Email = userName,
                        Token = token
                    };

                    var securedToken = urlSafeSecureDataSerializer.Serialize(
                        userConfirmationToken);

                    await mailer.UserConfirmationAsync(userName, securedToken);
                }
                else
                {
                    seedDataLoader.Load(userName);
                }

                return(Request.CreateResponse(HttpStatusCode.NoContent));
            }

            switch (statusCode)
            {
            case MembershipCreateStatus.DuplicateUserName:
            case MembershipCreateStatus.DuplicateEmail:
            case MembershipCreateStatus.DuplicateProviderUserKey:
                ModelState.AddModelError(
                    "email",
                    "User with same email already exits.");
                break;

            case MembershipCreateStatus.InvalidUserName:
            case MembershipCreateStatus.InvalidEmail:
                ModelState.AddModelError(
                    "email",
                    "Invalid email address.");
                break;

            case MembershipCreateStatus.InvalidPassword:
                ModelState.AddModelError("password", "Invalid password.");
                break;

            default:
                ModelState.AddModelError(
                    string.Empty,
                    "Unexpected error.");
                break;
            }

            return(Request.CreateErrorResponse(
                       HttpStatusCode.BadRequest, ModelState));
        }
        public async Task<HttpResponseMessage> Post(CreateUser model)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(
                    HttpStatusCode.BadRequest, ModelState);
            }

            var email = model.Email.ToLower(CultureInfo.CurrentCulture);
            var requiresActivation = !IsDebuggingEnabled;

            try
            {
                var token = await membershipService.Signup(
                    email,
                    model.Password,
                    UserRoles.User,
                    requiresActivation);

                if (requiresActivation)
                {
                    var userConfirmationToken = new UserConfirmationToken
                                                    {
                                                        Email = email,
                                                        Token = token
                                                    };

                    var securedToken = urlSafeSecureDataSerializer.Serialize(
                        userConfirmationToken);

                    await mailer.UserConfirmationAsync(email, securedToken);
                }
                else
                {
                    await newUserConfirmedHandler.Handle(email);
                }

                return Request.CreateResponse(HttpStatusCode.NoContent);
            }
            catch (IdentityException e)
            {
                ModelState.AddModelError(string.Empty, e);

                return Request.CreateErrorResponse(
                    HttpStatusCode.BadRequest, ModelState);
            }
        }
        public async Task<HttpResponseMessage> Post(CreateUser model)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(
                    HttpStatusCode.BadRequest, ModelState);
            }

            var statusCode = MembershipCreateStatus.Success;
            var userName = model.Email.ToLowerInvariant();
            var token = string.Empty;

            var requireConfirmation = !IsDebuggingEnabled;

            try
            {
                token = signup(userName, model.Password, requireConfirmation);
            }
            catch (MembershipCreateUserException e)
            {
                statusCode = e.StatusCode;
            }

            if (statusCode == MembershipCreateStatus.Success)
            {
                if (requireConfirmation)
                {
                    var userConfirmationToken = new UserConfirmationToken
                                                    {
                                                        Email = userName,
                                                        Token = token
                                                    };

                    var securedToken = urlSafeSecureDataSerializer.Serialize(
                        userConfirmationToken);

                    await mailer.UserConfirmationAsync(userName, securedToken);
                }
                else
                {
                    seedDataLoader.Load(userName);
                }

                return Request.CreateResponse(HttpStatusCode.NoContent);
            }

            switch (statusCode)
            {
                case MembershipCreateStatus.DuplicateUserName:
                case MembershipCreateStatus.DuplicateEmail:
                case MembershipCreateStatus.DuplicateProviderUserKey:
                    ModelState.AddModelError(
                        "email",
                        "User with same email already exits.");
                    break;
                case MembershipCreateStatus.InvalidUserName:
                case MembershipCreateStatus.InvalidEmail:
                    ModelState.AddModelError(
                        "email",
                        "Invalid email address.");
                    break;
                case MembershipCreateStatus.InvalidPassword:
                    ModelState.AddModelError("password", "Invalid password.");
                    break;
                default:
                    ModelState.AddModelError(
                        string.Empty,
                        "Unexpected error.");
                    break;
            }

            return Request.CreateErrorResponse(
                HttpStatusCode.BadRequest, ModelState);
        }