public async Task <IActionResult> LoginFacebookCallback()
        {
            ExternalLoginInfo info = await signInManager.GetExternalLoginInfoAsync();

            await signInManager.SignOutAsync();

            var signInResult = await signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent : false);

            if (!signInResult.Succeeded)
            {
                var emailClaim         = info.Principal.FindFirst(c => c.Type.Contains("emailaddress"));
                var givenNameClaim     = info.Principal.FindFirst(c => c.Type.Contains("givenname"));
                var surnameClaim       = info.Principal.FindFirst(c => c.Type.Contains("surname"));
                var associateAccountVM = new AssociateAccountViewModel
                {
                    FirstName = givenNameClaim.Value,
                    LastName  = surnameClaim.Value,
                    Email     = emailClaim.Value
                };

                return(View("AssociateAccount", associateAccountVM));
            }

            return(RedirectToAction("Index", "Home"));
        }
        public IActionResult AssociateAccount(AssociateAccountViewModel associateAccountVM)
        {
            if (ModelState.IsValid)
            {
                var properties = signInManager.ConfigureExternalAuthenticationProperties("Facebook", Url.Action("AssociateAccountCallback", "Account"));
                HttpContext.Session.SetJson("AssociateAccountViewModel", associateAccountVM);
                return(Challenge(properties, "Facebook"));
            }

            return(View("AssociateAccount", associateAccountVM));
        }
        private async Task <IdentityResult> CreateAssociatedAccount(AssociateAccountViewModel associateAccountViewModel,
                                                                    ExternalLoginInfo info)
        {
            AppUser user = new AppUser
            {
                UserName  = associateAccountViewModel.Email,
                FirstName = associateAccountViewModel.FirstName,
                LastName  = associateAccountViewModel.LastName,
                Email     = associateAccountViewModel.Email,
            };

            IdentityResult result = await userManager.CreateAsync(user);

            if (result.Succeeded)
            {
                await userManager.AddLoginAsync(user, info);

                await userManager.AddToRoleAsync(user, "Regular");
            }

            return(result);
        }