public ExternalLoginHandlerViewModel 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;
        }
        public void 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);
        }