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

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

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

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

如果用户单击 register button 则返回并发生错误"user exists" . 但是,如果用户使用本地帐户登录并使用管理控制器中的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 });
        }
    }