Exemplo n.º 1
0
        public UserCredential RegisterUser(RegistrationUserIdentityDto newCredentials, string password)
        {
            if (string.IsNullOrWhiteSpace(password))
            {
                throw new AppException("Password is required");
            }

            if (db.UserCredentials.IsEmailReserved(newCredentials.Email))
            {
                throw new AppException($"Username \\ {newCredentials.Email} \\ is already taken");
            }

            int existingUserId;

            CreatePasswordHash(password, out var passwordHash, out var passwordSalt);

            if (db.Users.GetUserByPhoneNumber(newCredentials.PhoneNumber) != null)
            {
                existingUserId = db.Users.GetUserByPhoneNumber(newCredentials.PhoneNumber).Id;
            }
            else
            {
                var user = new User
                {
                    FirstName   = newCredentials.FirstName,
                    LastName    = newCredentials.LastName,
                    PhoneNumber = newCredentials.PhoneNumber
                };
                db.Users.AddEntity(user);
                db.Save();
                existingUserId = user.Id;
            }

            var formedCredentials = new UserCredential
            {
                Email        = newCredentials.Email,
                UserId       = existingUserId,
                PasswordHash = passwordHash,
                PasswordSalt = passwordSalt
            };

            db.UserCredentials.AddEntity(formedCredentials);
            db.Save();

            return(formedCredentials);
        }
        public IActionResult Register([FromBody] RegistrationUserIdentityDto registrationCredentialsDto)
        {
            try
            {
                // save
                var registeredUser = _authenticationService.RegisterUser(registrationCredentialsDto, registrationCredentialsDto.Password);

                var registeredCredentials =
                    _authenticationService.Authenticate(registrationCredentialsDto.Email, registrationCredentialsDto.Password);
                var now = DateTime.UtcNow;

                // creating JWT-token
                var jwt = new JwtSecurityToken(
                    issuer: AuthOptions.ISSUER,
                    audience: AuthOptions.AUDIENCE,
                    notBefore: now,
                    claims: registeredCredentials.Claims,
                    expires: now.Add(TimeSpan.FromMinutes(AuthOptions.LIFETIME)),
                    signingCredentials: new SigningCredentials(AuthOptions.GetSymmetricSecurityKey(),
                                                               SecurityAlgorithms.HmacSha256));
                var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);

                var response = new
                {
                    accessToken   = encodedJwt,
                    tokenLifeTime = 3600000,
                    userId        = registeredUser.UserId
                };
                _authenticatedHubContext.Clients.All.UserRegistered(registeredUser.UserId);

                return(Ok(response));
            }
            catch (AppException ex)
            {
                // return error message if there was an exception
                return(BadRequest(new { message = ex.Message }));
            }
        }