C# ASP.NET MVC5身份在用户注册期间链接本地帐户和外部帐户(社会索赔)
我正在使用ASP.Net身份的外部登录 使用标准功能,一切正常。我正在尝试扩展身份以使用声明登录到应用程序 我可以添加外部提供程序。现在我正在尝试链接多个外部提供者 也就是说,如果用户已经拥有本地帐户,并且如果同一用户尝试使用Google(或其他提供商)登录,则account controller外部回调方法不会识别本地用户(下面默认代码“SignInManager.ExternalSignInAsync(loginInfo,isPersistent:false);”中的代码块给出SignInStatus.Failure)并重定向用户以使用声明中的电子邮件进行注册 如果用户单击注册按钮,则返回错误“用户存在”。然而,如果用户使用本地帐户登录,并使用Manage controller中的Managelogins操作方法执行相同的操作,则会链接帐户 我正试图通过注册操作实现同样的效果,而无需用户使用本地帐户登录,并在第一时间自动链接社交提供商,或重定向用户以链接帐户 asp.net mvc5脚手架的默认代码。我尝试了所有不同的选项,您可以在方法中的注释代码中看到。但什么都没用C# ASP.NET MVC5身份在用户注册期间链接本地帐户和外部帐户(社会索赔),c#,asp.net,asp.net-mvc,asp.net-identity,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Asp.net Identity,Asp.net Mvc 5,我正在使用ASP.Net身份的外部登录 使用标准功能,一切正常。我正在尝试扩展身份以使用声明登录到应用程序 我可以添加外部提供程序。现在我正在尝试链接多个外部提供者 也就是说,如果用户已经拥有本地帐户,并且如果同一用户尝试使用Google(或其他提供商)登录,则account controller外部回调方法不会识别本地用户(下面默认代码“SignInManager.ExternalSignInAsync(loginInfo,isPersistent:false);”中的代码块给出SignInS
// 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 });
}
}
//获取:/Account/ExternalLoginCallback
[异名]
公共异步任务ExternalLoginCallback(字符串返回URL)
{
var loginInfo=await AuthenticationManager.GetExternalLoginInfoAsync();
if(loginInfo==null)
{
返回重定向操作(“登录”);
}
//var externalLoginInfo=await _signInManager.AuthenticationManager.getexternallogininfosync();
//if(externalLoginInfo==null)
//{
//返回重定向操作(“索引”、“签名”);
//}
//var u=SignInManager.UserManager.FindAsync(loginInfo.Login);
////检查具有此外部登录提供程序的用户是否已登录
//if(wait SignInManager.UserManager.FindAsync(loginInfo.Login)!=null)
//返回重定向操作(“索引”、“帐户”);
//等待SignInManager.UserManager.AddLoginAsync(HttpContext.GetOwinContext().Authentication.User.Identity.GetUserId(),loginInfo.Login);
////返回操作(“索引”、“社交”);
////如果用户已经登录,请使用此外部登录提供程序登录该用户
var result=await SignInManager.ExternalSignInAsync(loginInfo,ispersist:true);
开关(结果)
{
案例标志状态成功:
返回重定向到本地(returnUrl);
案例标志状态锁定输出:
返回视图(“锁定”);
案例标志状态。要求验证:
return RedirectToAction(“SendCode”,new{ReturnUrl=ReturnUrl,RememberMe=false});
案例信号状态故障:
违约:
//如果用户没有帐户,则提示用户创建帐户
ViewBag.ReturnUrl=返回URL;
ViewBag.LoginProvider=loginInfo.Login.LoginProvider;
返回视图(“ExternalLoginConfirmation”,新的ExternalLoginConfirmationViewModel{Email=loginInfo.Email});
}
}
您找到这个问题的答案了吗?我今天遇到了同样的情况。是的,我能找到答案。我将很快发布解决方案。最简单的修复方法是,如果用户已经拥有本地帐户,并且希望链接外部提供商。那么用户可以使用本地凭据登录应用程序,然后转到管理并将其帐户链接到外部提供商。这与Microsoft使用的方法相同。如果用户没有本地帐户,则可以使用外部提供程序创建新帐户。这是最好的安全实践之一,这样应用程序在帐户退出应用程序时不会泄漏。