ExternalLoginHandler(
            ExternalLoginHandlerViewModel model,
            ModelMethodContext context)
        {
            if (!context.ModelState.IsValid)
            {
                return;
            }

            var newUser = CreateUserFromRegistration(model);

            var result = _userManager.Create(newUser);

            if (result.Succeeded)
            {
                var loginInfo = _context.GetOwinContext().Authentication
                                .GetExternalLoginInfo();

                if (loginInfo == null)
                {
                    ExternalLoginFailRedirect();
                    return;
                }

                result = _userManager.AddLogin(newUser.Id, loginInfo.Login);
                if (result.Succeeded)
                {
                    // Microsoft's default approach does not validate the user's
                    // email address, deferring the authentication to the
                    // third-party provider.
                    //
                    // SignIn(user, isPersistent: false);
                    // RedirectToLocal();

                    RegisterNewUser(newUser);
                    return;
                }
            }

            AddErrors(result, context);
        }
        GetExternalLoginHandler(ModelMethodContext context)
        {
            var model = new ExternalLoginHandlerViewModel
            {
                ProviderName = StateContext.Data[ProviderNameKey] as string
            };

            // Check that a Provider is specified
            if (String.IsNullOrWhiteSpace(model.ProviderName))
            {
                ExternalLoginFailRedirect();
                return(null);
            }

            var loginInfo = _authenticationManager.GetExternalLoginInfo();

            if (loginInfo == null)
            {
                ExternalLoginFailRedirect();
                return(null);
            }

            var signInStatus = ExternalSignIn(loginInfo, false);

            switch (signInStatus)
            {
            case SignInStatus.Success:
                RedirectToLocal();
                return(null);

            case SignInStatus.NotVerified:
                var user = _userManager.Find(loginInfo.Login);
                SendEmailVerificationCode(user, reminder: true);
                return(null);

            case SignInStatus.LockedOut:
                StateController.Navigate("AccountLocked");
                return(null);

            case SignInStatus.RequiresTwoFactorAuthentication:
                StateController.Navigate(
                    "SendTwoFactorCode", new NavigationData
                {
                    { ReturnUrlKey, StateContext.Data[ReturnUrlKey] }
                });
                return(null);
            }

            if (_context.User.Identity.IsAuthenticated)
            {
                // Apply Xsrf check when linking
                var userId            = _context.User.Identity.GetUserId();
                var verifiedloginInfo = _authenticationManager
                                        .GetExternalLoginInfo(XsrfKey, userId);

                if (verifiedloginInfo == null)
                {
                    ExternalLoginFailRedirect();
                    return(null);
                }

                var result = _userManager.AddLogin(userId, verifiedloginInfo.Login);
                if (result.Succeeded)
                {
                    RedirectToLocal();
                    return(null);
                }

                AddErrors(result, context);
            }
            else
            {
                // It's a new account, so get additional local details
                model.UserName = loginInfo.DefaultUserName;
                model.Email    = loginInfo.Email;
            }

            return(model);
        }