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"));
            }
        }
Exemple #2
0
        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));
            }
        }