MVC外部登录 - 如何跳过关联表单

vik*_*ntx 2 c# asp.net-mvc-5 asp.net-identity

我想跳过外部登录注册 - 关联表单 在此输入图像描述
我正在使用谷歌外部登录MVC5,如果您使用谷歌帐户登录,它会在第一次输入谷歌凭证后显示在屏幕上方.我只是想跳过这个屏幕.

上面的视图从中返回

        [AllowAnonymous]
        public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
        {
            var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
            if (loginInfo == null)
            {
                return RedirectToAction("Login");
            }

            // Sign in the user with this external login provider if the user already has a login
            var user = await UserManager.FindAsync(loginInfo.Login);
            if (user != null)
            {
                await SignInAsync(user, isPersistent: false);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                // If the user does not have an account, then prompt the user to create an account
                ViewBag.ReturnUrl = returnUrl;
                ViewBag.LoginProvider = loginInfo.Login.LoginProvider;

                return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });
            }
        }
Run Code Online (Sandbox Code Playgroud)



return View("ExternalLoginConfirmation",new ExternalLoginConfirmationViewModel {Email = loginInfo.Email});

上面的代码返回ExternalLoginConfirmation视图并显示在屏幕上方.如果提交上述表格,将提交以下行动

public async Task ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model,string returnUrl)

要跳过上面的登录画面,我需要调用ExternalLoginConfirmationExternalLoginCallback,所以我怎么能做到这一点.

ese*_*elk 5

好吧,没有花太多时间把它放在一起.我没有对它进行过测试,但如果它不能正常工作,那么应该非常接近.我主要是将代码从ExternalLoginConfirmation复制到ExternalLoginCallback:

        // Sign in the user with this external login provider if the user already has a login
        var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false });
            case SignInStatus.Failure:
            default:

                // Added this section to automatically create account if we have an email address
                if (!string.IsNullOrEmpty(loginInfo.Email))
                {
                    var user = new ApplicationUser { UserName = loginInfo.Email, Email = loginInfo.Email };
                    var createUserResult = await UserManager.CreateAsync(user);
                    if (createUserResult.Succeeded)
                    {
                        var addLoginResult = await UserManager.AddLoginAsync(user.Id, loginInfo.Login);
                        if(addLoginResult.Succeeded)
                        {
                            await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                            return RedirectToLocal(returnUrl);
                        }
                    }
                }

                // If the user does not have an account, then prompt the user to create an account
                ViewBag.ReturnUrl = returnUrl;
                ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
                return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });
        }
Run Code Online (Sandbox Code Playgroud)