public async Task <IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null) { if (remoteError != null) { ModelState.AddModelError(string.Empty, $"Error from external provider: {remoteError}"); return(View(nameof(Login))); } ExternalLoginInfo info = await _signInManager.GetExternalLoginInfoAsync(); if (info == null) { return(RedirectToAction(nameof(Login))); } // Sign in the user with this external login provider if the user already has a login. var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent : false); if (result.Succeeded) { _logger.LogInformation(5, "User logged in with {Name} provider.", info.LoginProvider); return(RedirectToLocal(returnUrl)); } if (result.RequiresTwoFactor) { return(RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl })); } if (result.IsLockedOut) { return(View("Lockout")); } else { if (info == null) { return(View("ExternalLoginFailure")); } Dictionary <string, string> tokenData = info.AuthenticationTokens.ToDictionary(x => x.Name, x => x.Value); var user = new ApplicationUser { FacebookID = info.ProviderKey, Email = info.Principal.FindFirstValue(ClaimTypes.Email), DisplayName = info.Principal.FindFirstValue("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"), UserName = info.ProviderKey, AuthToken = tokenData["access_token"], AuthTokenExpiration = DateTime.Parse(tokenData["expires_at"]), URLPath = await _fbapi.GetAvatarURL(info.ProviderKey) }; IdentityResult identity = await _userManager.CreateAsync(user); if (identity.Succeeded) { identity = await _userManager.AddLoginAsync(user, info); if (identity.Succeeded) { identity = await _userManager.AddToRoleAsync(user, RoleHandler.Post); if (identity.Succeeded) { await _signInManager.SignInAsync(user, isPersistent : false); _logger.LogInformation(6, "User created an account using {Name} provider.", info.LoginProvider); return(RedirectToLocal(returnUrl)); } AddErrors(identity); } AddErrors(identity); } AddErrors(identity); return(View("Error")); //// If the user does not have an account, then ask the user to create an account. //ViewData["ReturnUrl"] = returnUrl; //ViewData["LoginProvider"] = info.LoginProvider; //var email = info.Principal.FindFirstValue(ClaimTypes.Email); //return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = email }); } }