Ejemplo n.º 1
0
 public ExternalLoginCallbackViewModel BuildExternalLoginCallbackViewModel(ExternalLoginCallbackInputModel inputModel,
                                                                           string loginProvider, string returnUrl)
 {
     return(new ExternalLoginCallbackViewModel
            (
                loginProvider,
                returnUrl
            )
     {
         FirstName = inputModel.FirstName,
         LastName = inputModel.LastName,
         EmailAddress = inputModel.EmailAddress
     });
 }
Ejemplo n.º 2
0
        public async Task <IActionResult> ExternalLoginCallback([FromQuery] string returnUrl,
                                                                [FromQuery] string remoteError, CancellationToken cancellationToken)
        {
            if (remoteError != null)
            {
                return(View("Error"));
            }

            await HttpContext.AuthenticateAsync(IdentityConstants.ExternalScheme);

            var externalLoginInfo = await _signInManager.GetExternalLoginInfoAsync();

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

            var signInResult =
                await _signInManager.ExternalLoginSignInAsync(externalLoginInfo.LoginProvider, externalLoginInfo.ProviderKey, false,
                                                              false);

            if (!signInResult.Succeeded)
            {
                if (signInResult.IsLockedOut)
                {
                    return(RedirectToRoute("LockedOut"));
                }

                if (signInResult.IsNotAllowed)
                {
                    var user = await _userManager.FindByLoginAsync(externalLoginInfo.LoginProvider, externalLoginInfo.ProviderKey);

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

                    return(View("Error"));
                }

                if (signInResult.RequiresTwoFactor)
                {
                    // TODO LoginTwoFactor

                    return(View("Error"));
                    //return RedirectToRoute("LoginTwoFactor", new { returnUrl });
                }

                var emailAddress = Regex.Replace(externalLoginInfo.Principal.FindFirstValue(ClaimTypes.Email), @"\+[^@]+", "");
                var name         = externalLoginInfo.Principal.FindFirstValue(ClaimTypes.Name)?.Split(" ");

                var model = new ExternalLoginCallbackInputModel
                {
                    FirstName    = name?.First(),
                    LastName     = name?.Length > 1 ? name.Last() : null,
                    EmailAddress = emailAddress
                };

                ModelState.SetModelValue(nameof(model.FirstName), model.FirstName, model.FirstName);
                ModelState.SetModelValue(nameof(model.LastName), model.LastName, model.LastName);
                ModelState.SetModelValue(nameof(model.EmailAddress), model.EmailAddress, model.EmailAddress);

                TryValidateModel(model);

                return(await ExternalLoginCallback(model, returnUrl, true, cancellationToken));
            }

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

            return(RedirectToRoute("Home"));
        }
Ejemplo n.º 3
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"));
        }