public async Task <IActionResult> Register(RegisterViewModel model) { if (_dbContext.Users.Any(x => x.UserName == model.Input.Username)) { ModelState.AddModelError("UsernameExists", "Username already exists."); } if (_dbContext.Users.Any(x => x.Email == model.Input.Email)) { ModelState.AddModelError("EmailExists", "Email already exists."); } if (ModelState.IsValid) { var world = _dbContext.Worlds.Find(model.Input.SelectedWorld); var tribe = _dbContext.Tribes.Find(model.Input.SelectedTribe); var user = new User { UserName = model.Input.Username, Email = model.Input.Email, Tribe = tribe, World = world }; var result = await _userManager.CreateAsync(user, model.Input.Password); if (result.Succeeded) { await _userManager.AddToRoleAsync(user, "Player"); var tile = _tileService.DetermineCityStartingTile(world); var village = _villageService.CreateVillageForUser(user, tile); var rfs = _resourceFieldService.SeedVillageWithBasicResourceFields(village, tile.Type); village.ResourceFields = rfs.ToList(); _dbContext.Villages.Update(village); _dbContext.SaveChanges(); _logger.LogInformation("User created a new account with password."); var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); var callbackUrl = Url.Page( "/Account/ConfirmEmail", pageHandler: null, values: new { userId = user.Id, code = code }, protocol: Request.Scheme); await _emailSender.SendEmailAsync(model.Input.Email, "Confirm your email", $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>."); await _signInManager.SignInAsync(user, isPersistent : false); return(RedirectToAction("Login")); } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } _dbContext.SaveChanges(); model.Input.AvailableTribes = GenerateTribeSelectList(); model.Input.AvailableWorlds = GenerateWorldSelectListAsync(); return(View(model)); }