public async Task <IActionResult> Register([FromForm] RegisterInputModel inputModel,
                                                   [FromQuery] string returnUrl, CancellationToken cancellationToken)
        {
            RegisterViewModel viewModel;

            if (!ModelState.IsValid)
            {
                viewModel = BuildRegisterViewModel(returnUrl);

                return(View(viewModel));
            }

            var emailAddress = Regex.Replace(inputModel.EmailAddress, @"\+[^@]+", "");

            if (await _userManager.FindByEmailAsync(emailAddress) != null)
            {
                ModelState.AddModelError(nameof(inputModel.EmailAddress), "This email address has already been registered");

                viewModel = BuildRegisterViewModel(returnUrl);

                return(View(viewModel));
            }

            var user = new StubblUser
            {
                FirstName    = inputModel.FirstName,
                LastName     = inputModel.LastName,
                EmailAddress = emailAddress,
                Username     = inputModel.EmailAddress
            };

            var result = await _userManager.CreateAsync(user, inputModel.Password);

            if (!result.Succeeded)
            {
                return(View("Error"));
            }

            var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);

            var callbackUrl = Url.RouteUrl("ConfirmEmailAddress", new { userId = user.Id, token, returnUrl },
                                           Request.Scheme);
            var email = new ConfirmEmailAddressEmail
                        (
                user.EmailAddress,
                callbackUrl
                        );

            await _emailSender.SendEmailAsync(email, cancellationToken);

            if (_signInManager.Options.SignIn.RequireConfirmedEmail)
            {
                return(RedirectToRoute("EmailAddressConfirmationSent", new { userId = user.Id, returnUrl }));
            }

            await _signInManager.SignInAsync(user, false);

            if (_interactionService.IsValidReturnUrl(returnUrl) || Url.IsLocalUrl(returnUrl))
            {
                return(Redirect(returnUrl));
            }

            return(RedirectToRoute("Home"));
        }
示例#2
0
        public async Task <IActionResult> ExternalLoginCallback([FromForm] ExternalLoginCallbackInputModel inputModel,
                                                                [FromQuery] string returnUrl, [FromQuery] bool isEmailAddressConfirmed, CancellationToken cancellationToken)
        {
            var externalLoginInfo = await _signInManager.GetExternalLoginInfoAsync();

            if (externalLoginInfo == null)
            {
                return(View("Error"));
            }

            if (!ModelState.IsValid)
            {
                var viewModel = BuildExternalLoginCallbackViewModel(inputModel, externalLoginInfo.LoginProvider, returnUrl);

                return(View(viewModel));
            }

            if (await _userManager.FindByEmailAsync(inputModel.EmailAddress) != null)
            {
                ModelState.AddModelError(nameof(inputModel.EmailAddress), "This email address has already been registered");

                var viewModel = BuildExternalLoginCallbackViewModel(inputModel, externalLoginInfo.LoginProvider, returnUrl);

                return(View(viewModel));
            }

            var user = new StubblUser
            {
                EmailAddress          = inputModel.EmailAddress,
                EmailAddressConfirmed = isEmailAddressConfirmed,
                FirstName             = inputModel.FirstName,
                LastName = inputModel.LastName,
                Username = inputModel.EmailAddress
            };

            var result = await _userManager.CreateAsync(user);

            if (!result.Succeeded)
            {
                return(View("Error"));
            }

            result = await _userManager.AddLoginAsync(user, externalLoginInfo);

            if (!result.Succeeded)
            {
                await _userManager.DeleteAsync(user);

                return(View("Error"));
            }

            await _signInManager.UpdateExternalAuthenticationTokensAsync(externalLoginInfo);

            if (!isEmailAddressConfirmed)
            {
                var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);

                var callbackUrl = Url.RouteUrl("ConfirmEmailAddress", new { userId = user.Id, token, returnUrl },
                                               Request.Scheme);
                var email = new ConfirmEmailAddressEmail
                            (
                    user.EmailAddress,
                    callbackUrl
                            );

                await _emailSender.SendEmailAsync(email, cancellationToken);

                if (_signInManager.Options.SignIn.RequireConfirmedEmail)
                {
                    return(RedirectToRoute("EmailAddressConfirmationSent", new { userId = user.Id, returnUrl }));
                }

                return(View("Error"));
            }

            await _signInManager.SignInAsync(user, false);

            if (_interactionService.IsValidReturnUrl(returnUrl))
            {
                return(Redirect(returnUrl));
            }

            return(RedirectToRoute("Home"));
        }