Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // *** Program.cs: Turn of automatic error 400 ***
- builder.Services.Configure<ApiBehaviorOptions>(options => {
- options.SuppressModelStateInvalidFilter = true;
- });
- // *** Model - used internally ***
- public class User {
- public int Id { get; set; }
- public string Username { get; set; }
- public string Email { get; set; }
- public string PwdHash { get; set; }
- public string PwdSalt { get; set; }
- public string Phone { get; set; }
- public bool IsConfirmed { get; set; }
- public string SecurityToken { get; set; }
- }
- // *** Request model - passed to action, used to create model ***
- public class UserRegisterRequest
- {
- [Required, StringLength(50, MinimumLength = 6)]
- public string Username { get; set; }
- [Required]
- public string Password { get; set; }
- [Required]
- public string Email { get; set; }
- public string Phone { get; set; }
- }
- // *** Response model - returned from action, used as response ***
- public class UserRegisterResponse
- {
- public int Id { get; set; }
- public string SecurityToken { get; set; }
- }
- // *** UserController POST action for registering a new user ***
- [HttpPost("[action]")]
- public ActionResult<User> Register([FromBody] UserRegisterRequest request)
- {
- if(!ModelState.IsValid)
- return BadRequest(ModelState);
- try
- {
- // Username: Normalize and check if username exists
- var normalizedUsername = request.Username.ToLower().Trim();
- if (_users.Any(x => x.Username.Equals(normalizedUsername)))
- throw new InvalidOperationException("Username already exists");
- // Password: Salt and hash password
- byte[] salt = RandomNumberGenerator.GetBytes(128 / 8); // divide by 8 to convert bits to bytes
- string b64Salt = Convert.ToBase64String(salt);
- byte[] hash =
- KeyDerivation.Pbkdf2(
- password: request.Password,
- salt: salt,
- prf: KeyDerivationPrf.HMACSHA256,
- iterationCount: 100000,
- numBytesRequested: 256 / 8);
- string b64Hash = Convert.ToBase64String(hash);
- // SecurityToken: Random security token
- byte[] securityToken = RandomNumberGenerator.GetBytes(256 / 8);
- string b64SecToken = Convert.ToBase64String(securityToken);
- // Id: Next id
- int nextId = 1;
- if (_users.Any())
- {
- nextId = _users.Max(x => x.Id) + 1;
- }
- // New user
- var newUser = new User
- {
- Id = nextId,
- Username = request.Username,
- Email = request.Email,
- Phone = request.Phone,
- IsConfirmed = false,
- SecurityToken = b64SecToken,
- PwdSalt = b64Salt,
- PwdHash = b64Hash
- };
- _users.Add(newUser);
- return Ok(new UserRegisterResponse
- {
- Id = newUser.Id,
- SecurityToken = newUser.SecurityToken
- });
- }
- catch (InvalidOperationException ex)
- {
- return BadRequest(ex.Message);
- }
- }
Add Comment
Please, Sign In to add comment