AspNet Core 与 Google 和 Facebook 进行外部身份验证

问题描述 投票:0回答:1

我正在尝试使用 Google 和 Facebook 身份验证在 ASP.Net Core 中实现表单身份验证。 我遵循了一些教程,经过一番努力,我设法让它同时工作。

但是,问题是我无法对同一封电子邮件使用两种身份验证。

例如,我的电子邮件是“[电子邮件受保护]”。 我首先使用 Facebook 身份验证登录...注册了我的电子邮件,它成功运行并将我的记录放入“dbo.ASPNetUsers”表中。

然后我退出,点击谷歌验证登录。它验证成功,但当我尝试注册时,它一直说我的电子邮件已被占用。

enter image description here

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

enter image description here

我希望在我的网站上拥有该功能,您能否告诉我如何实现这一目标。

理论上,它应该在“dbo.AspNetUserLogins”中放置另一行,并且应该将相同的 UserId 与多个登录链接起来。

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

enter image description here

asp.net-core asp.net-identity forms-authentication google-signin facebook-authentication
1个回答
1
投票

您需要使用

UserManager.AddLoginAsync
将您的 Facebook 外部登录名与您的 Google 外部登录名与您的电子邮件链接起来,如果您使用该地址作为登录名,则不能使用同一地址注册两次。
查看 Identity github 存储库上的 Identity 示例。

https://github.com/aspnet/Identity/blob/dev/samples/IdentitySample.Mvc/Controllers/ManageController.cs

为了将外部登录链接到用户,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 });
}
© www.soinside.com 2019 - 2024. All rights reserved.