Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC5身份在用户注册期间链接本地帐户和外部帐户(社会索赔)_C#_Asp.net_Asp.net Mvc_Asp.net Identity_Asp.net Mvc 5 - Fatal编程技术网

C# 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

我正在使用ASP.Net身份的外部登录

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

我可以添加外部提供程序。现在我正在尝试链接多个外部提供者

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

如果用户单击注册按钮,则返回错误“用户存在”。然而,如果用户使用本地帐户登录,并使用Manage controller中的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 });
        }
    }
//获取:/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使用的方法相同。如果用户没有本地帐户,则可以使用外部提供程序创建新帐户。这是最好的安全实践之一,这样应用程序在帐户退出应用程序时不会泄漏。