我正在使用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 });
}
}