Asp.net core AspNet核心与Google和Facebook的外部身份验证
我正在尝试在ASP.NETCore中使用Google和Facebook身份验证来实现表单身份验证。我学习了一些教程,经过一些努力,我成功地做到了这两个方面 但是,问题是我不能对同一封电子邮件同时使用两种身份验证 例如,我的电子邮件是'ttcg@gmail.com'. 我使用Facebook身份验证先登录。。。注册了我的电子邮件,它成功地运行并将我的记录放入“dbo.ASPNetUsers”表中 然后我退出,点击谷歌认证登录。它已成功通过身份验证,但当我尝试注册时,它一直说我的电子邮件已被接收 我尝试对其他在线网站(如Stackoverflow)做同样的事情。我在谷歌和Facebook上使用了相同的电子邮件,网站知道,我是同一个人,我的登录/声明都是链接的,尽管它们来自不同的地方(谷歌和Facebook) 我想在我的网站上有这个功能,你能告诉我如何才能做到这一点吗 理论上,它应该在“dbo.AspNetUserLogins”中添加另一行,并将同一用户ID与多个登录链接起来 我是否需要实现自己的SignInManager.SignInAsync方法来实现该功能?或者我缺少任何配置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”表中 然后我退出,点击谷歌认证登录。它已成功通过身份验证,但当我尝试注册时,它一直说我的电子邮件已被接收
您需要使用
用户管理器将您的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中问一个新问题。我不知道你有什么问题我可以问,但几乎可以肯定它会被标记为重复让我们。