在用户注册期间,ASP.NET MVC5标识将本地帐户与外部帐户(社交声明)相关联

时间:2017-05-26 18:10:11

标签: c# asp.net asp.net-mvc asp.net-identity asp.net-mvc-5

我正在使用ASP.Net Identity进行外部登录。

标准功能一切都很好。我正在尝试扩展身份以使用声明登录到应用程序。

我能够添加外部提供商。现在我正在尝试链接多个外部提供商。

话虽如此,如果用户已经拥有本地帐户并且同一用户尝试使用Google(或其他提供商)登录,则帐户控制器外部回调方法不会识别本地用户(来自以下默认代码的代码块) SignInManager.ExternalSignInAsync(loginInfo,isPersistent:false);“给SignInStatus.Failure。”并重定向用户注册索赔中的电子邮件。

如果用户点击注册按钮,则会返回错误“用户存在”。但是,如果用户使用本地帐户登录并使用管理控制器中的Managelogins操作方法执行相同操作 - 帐户已链接。

我正在尝试使用注册操作实现相同的功能,而无需用户使用本地帐户登录,并且首次自动链接社交提供商或重定向用户以链接帐户。

使用asp.net mvc5脚手架的默认代码。我尝试了所有不同的选项,您可以在方法中的注释代码中看到。但没有任何效果。

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

        //var externalLoginInfo = await _signInManager.AuthenticationManager.GetExternalLoginInfoAsync();
        //if (externalLoginInfo == null)
        //{
        //    return RedirectToAction("Index", "SignIn");
        //}

        //var u = SignInManager.UserManager.FindAsync(loginInfo.Login);
        //// Check if the user with this external login provider already has a login
        //if (await SignInManager.UserManager.FindAsync(loginInfo.Login) != null) 
        //    return RedirectToAction("Index", "Account");

        //await SignInManager.UserManager.AddLoginAsync(HttpContext.GetOwinContext().Authentication.User.Identity.GetUserId<string>(), loginInfo.Login);

        ////return RedirectToAction("Index", "Social");

        //// Sign in the user with this external login provider if the user already has a login
        var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: true);
        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:
                // 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 });
        }
    }

0 个答案:

没有答案