Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Asp.net core AspNet核心与Google和Facebook的外部身份验证_Asp.net Core_Asp.net Identity_Forms Authentication_Google Signin_Facebook Authentication - Fatal编程技术网

Asp.net core AspNet核心与Google和Facebook的外部身份验证

Asp.net core AspNet核心与Google和Facebook的外部身份验证,asp.net-core,asp.net-identity,forms-authentication,google-signin,facebook-authentication,Asp.net Core,Asp.net Identity,Forms Authentication,Google Signin,Facebook Authentication,我正在尝试在ASP.NETCore中使用Google和Facebook身份验证来实现表单身份验证。我学习了一些教程,经过一些努力,我成功地做到了这两个方面 但是,问题是我不能对同一封电子邮件同时使用两种身份验证 例如,我的电子邮件是'ttcg@gmail.com'. 我使用Facebook身份验证先登录。。。注册了我的电子邮件,它成功地运行并将我的记录放入“dbo.ASPNetUsers”表中 然后我退出,点击谷歌认证登录。它已成功通过身份验证,但当我尝试注册时,它一直说我的电子邮件已被接收

我正在尝试在ASP.NETCore中使用Google和Facebook身份验证来实现表单身份验证。我学习了一些教程,经过一些努力,我成功地做到了这两个方面

但是,问题是我不能对同一封电子邮件同时使用两种身份验证

例如,我的电子邮件是'ttcg@gmail.com'. 我使用Facebook身份验证先登录。。。注册了我的电子邮件,它成功地运行并将我的记录放入“dbo.ASPNetUsers”表中

然后我退出,点击谷歌认证登录。它已成功通过身份验证,但当我尝试注册时,它一直说我的电子邮件已被接收

我尝试对其他在线网站(如Stackoverflow)做同样的事情。我在谷歌和Facebook上使用了相同的电子邮件,网站知道,我是同一个人,我的登录/声明都是链接的,尽管它们来自不同的地方(谷歌和Facebook)

我想在我的网站上有这个功能,你能告诉我如何才能做到这一点吗

理论上,它应该在“dbo.AspNetUserLogins”中添加另一行,并将同一用户ID与多个登录链接起来

我是否需要实现自己的SignInManager.SignInAsync方法来实现该功能?或者我缺少任何配置


您需要使用
用户管理器将您的Facebook外部登录链接到您的Google外部登录。AddLoginAsync
,如果您使用同一个地址作为登录,则无法使用同一个地址注册两次。
在Identity github repo上查看Identity示例

为了将外部登录链接到用户,Manae控制器公开方法
LinkLogin
LinkLoginCallback

LinkLogin请求重定向到外部登录提供程序,以链接当前用户的登录
LinkLoginCallback处理提供程序响应

    //
    // POST: /Manage/LinkLogin
    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult LinkLogin(string provider)
    {
        // Request a redirect to the external login provider to link a login for the current user
        var redirectUrl = Url.Action("LinkLoginCallback", "Manage");
        var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl, _userManager.GetUserId(User));
        return Challenge(properties, provider);
    }

    //
    // GET: /Manage/LinkLoginCallback
    [HttpGet]
    public async Task<ActionResult> LinkLoginCallback()
    {
        var user = await GetCurrentUserAsync();
        if (user == null)
        {
            return View("Error");
        }
        var info = await _signInManager.GetExternalLoginInfoAsync(await _userManager.GetUserIdAsync(user));
        if (info == null)
        {
            return RedirectToAction(nameof(ManageLogins), new { Message = ManageMessageId.Error });
        }
        var result = await _userManager.AddLoginAsync(user, info);
        var message = result.Succeeded ? ManageMessageId.AddLoginSuccess : ManageMessageId.Error;
        return RedirectToAction(nameof(ManageLogins), new { Message = message });
    }
//
//POST:/Manage/LinkLogin
[HttpPost]
[ValidateAntiForgeryToken]
公共IActionResult链接登录(字符串提供程序)
{
//请求重定向到外部登录提供程序,以链接当前用户的登录
var redirectUrl=Url.Action(“LinkLoginCallback”、“Manage”);
var properties=_signInManager.ConfigureExternalAuthenticationProperties(提供程序,重定向URL,_userManager.GetUserId(用户));
返回质询(属性、提供者);
}
//
//获取:/Manage/LinkLoginCallback
[HttpGet]
公共异步任务LinkLoginCallback()
{
var user=await GetCurrentUserAsync();
if(user==null)
{
返回视图(“错误”);
}
var info=await\u signInManager.getexternallogininfosync(await\u userManager.GetUserIdAsync(user));
if(info==null)
{
返回RedirectToAction(nameof(ManageLogins),new{Message=ManageMessageId.Error});
}
var result=await\u userManager.AddLoginAsync(用户,信息);
var message=result.successed?ManageMessageId.AddLoginSAccess:ManageMessageId.Error;
返回RedirectToAction(nameof(ManageLogins),new{Message=Message});
}

在VS模板中,您可以通过登录并添加另一个提供程序后转到“管理”页面来添加该提供程序,而不是尝试注册为新用户。仅通过电子邮件地址进行关联还不够强大,因为应用程序无法验证您是否真正拥有该地址。您能提供更多详细信息吗?如何使用AddLoginAsync链接FB和Google帐户?代码看起来和我现在在ManageController中的代码一样。我到底应该改变什么?在stackoverflow中问一个新问题。我不知道你有什么问题我可以问,但几乎可以肯定它会被标记为重复让我们。