public async Task <IActionResult> RegisterPost() { var request = HttpContext.Request; var formData = await request.ReadFormAsync(); var user = new DejarixUser { Id = Guid.NewGuid(), UserName = formData["register-username"], Email = formData["register-email"], RegistrationDate = DateTimeOffset.Now }; var password = formData["register-password"]; var passwordConfirm = formData["register-password-confirm"]; if (password != passwordConfirm) { ViewData["RegistrationErrors"] = new string[] { "Passwords do not match." }; return(View("Register")); } var result = await _userManager.CreateAsync(user, password); if (result.Succeeded) { var token = await _userManager.GenerateEmailConfirmationTokenAsync(user); var bytes = Encoding.UTF8.GetBytes(token); var hexToken = bytes.ToHex(); var url = $"{_linkHost}/Account/Confirm?userId={user.Id}&token={hexToken}"; var email = new Email { From = _sender, To = user.Email.Yield(), Bcc = _bcc?.Yield(), Subject = $"Confirm {user.Email} on DEJARIX", TextBody = "Visit this URL to confirm your email address at DEJARIX: " + url, HtmlBody = $"<h2>DEJARIX Registration</h2><p>Click <a href='{url}'>here</a> to confirm your email address.</p>" }; var response = await _mailgun.SendEmailAsync(email); response.EnsureSuccessStatusCode(); var content = await response.Content.ReadAsStringAsync(); ViewData["RegistrationSuccess"] = $"Registration successful! Check {user.Email} for your confirmation link!"; return(View("Register")); } else { ViewData["RegistrationErrors"] = result.Errors .Select(e => e.Description) .ToArray(); return(View("Register")); } }
public async Task <IActionResult> RegisterPost([FromServices] Mailgun mailgun) { var request = HttpContext.Request; var formData = await request.ReadFormAsync(); var user = new DejarixUser { Id = Guid.NewGuid(), UserName = formData["register-username"], Email = formData["register-email"], RegistrationDate = DateTimeOffset.Now }; var model = new RegisterViewModel { PreviousUserName = user.UserName, PreviousEmail = user.Email }; var errors = new List <string>(); if (user.UserName.Length < 3) { errors.Add("Username must be at least 3 characters."); } var password = formData["register-password"]; var passwordConfirm = formData["register-password-confirm"]; if (password != passwordConfirm) { errors.Add("Passwords do not match."); } if (errors.Count > 0) { model.Errors = errors.ToArray(); return(View(nameof(Register), model)); } var result = await _userManager.CreateAsync(user, password); if (result.Succeeded) { var token = await _userManager.GenerateEmailConfirmationTokenAsync(user); var bytes = Encoding.UTF8.GetBytes(token); var hexToken = bytes.ToHex(); // https://stackoverflow.com/a/38311283 var path = Url.Action(nameof(Confirm), new { userId = user.Id, token = hexToken }); var host = request.Scheme + "://" + request.Host; var url = host + path; var email = new Email { From = mailgun.DefaultSender, To = ImmutableArray.Create(user.Email), Bcc = mailgun.DefaultBcc, Subject = $"Confirm {user.Email} on DEJARIX", TextBody = "Visit this URL to confirm your email address at DEJARIX: " + url, HtmlBody = $"<h2>DEJARIX Registration</h2><p>Click <a href='{url}'>here</a> to confirm your email address.</p>" }; var response = await mailgun.SendEmailAsync(email); model.Success = $"Registration successful! Check {user.Email} for your confirmation link! (Remember to check your spam folder.)"; return(View(nameof(Register), model)); } else { model.Errors = result.Errors .Select(e => e.Description) .ToArray(); return(View(nameof(Register), model)); } }