我正在尝试使用 Google 和 Facebook 身份验证在 ASP.Net Core 中实现表单身份验证。 我遵循了一些教程,经过一番努力,我设法让它同时工作。
但是,问题是我无法对同一封电子邮件使用两种身份验证。
例如,我的电子邮件是“[电子邮件受保护]”。 我首先使用 Facebook 身份验证登录...注册了我的电子邮件,它成功运行并将我的记录放入“dbo.ASPNetUsers”表中。
然后我退出,点击谷歌验证登录。它验证成功,但当我尝试注册时,它一直说我的电子邮件已被占用。
我尝试对其他在线网站(例如 Stackoverflow)做同样的事情。 我在 Google 和 Facebook 上使用相同的电子邮件,并且该网站知道,我是同一个人,并且我的登录/声明都是链接的,即使它们来自不同的地方(Google 和 Facebook)。
我希望在我的网站上拥有该功能,您能否告诉我如何实现这一目标。
理论上,它应该在“dbo.AspNetUserLogins”中放置另一行,并且应该将相同的 UserId 与多个登录链接起来。
我是否需要实现自己的 SignInManager.SignInAsync 方法才能实现该功能? 还是我缺少任何配置?
您需要使用
UserManager.AddLoginAsync
将您的 Facebook 外部登录名与您的 Google 外部登录名与您的电子邮件链接起来,如果您使用该地址作为登录名,则不能使用同一地址注册两次。为了将外部登录链接到用户,Manae 控制器公开方法
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 });
}