예제 #1
0
        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 });
            }
        }