public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
 {
     NameValueCollection content =
         HttpUtility.ParseQueryString(actionContext.Request.Content.ReadAsStringAsync().Result);
     var model = new Mailgun();
     content.ToDictionary().ForEach(i => model.Add(i.Key.ToLower(), i.Value));
     bindingContext.Model = model;
     return true;
 }
Example #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));
            }
        }