首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将新的Google或Facebook登录与现有帐户关联起来

将新的Google或Facebook登录与现有帐户关联起来
EN

Stack Overflow用户
提问于 2015-09-20 14:21:02
回答 6查看 8.8K关注 0票数 15

我刚刚按照这篇文章中的说明将谷歌作为登录提供者添加到我的MVC 5应用程序中。一切似乎都正常,但当我通过谷歌登录时,它希望我将谷歌提供的电子邮件/用户名注册为我的应用程序中的一个新帐户。如果我保留电子邮件原样并点击“注册”按钮,它会告诉我地址已经被占用了,就像我之前在我的应用程序的登录提供商上注册的一样。

如何调整MVC项目模板生成的默认代码,使我能够将Google登录与现有的本地帐户关联起来?

P.S.我对Facebook也有同样的问题。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-09-29 18:39:45

我认为身份处理它的方式是故意的,因为没有真正的方法来验证用户的身份仅通过电子邮件来自第三方。虽然风险可能相对较低,但有可能有人可以使用不属于自己的电子邮件地址在Facebook这样的第三方创建一个帐户,然后使用第三方登录在同一封电子邮件附加的另一个网站上模拟一个帐户。

因此,身份只允许您在登录时使用外部登录创建一个新帐户,而不是附加到现有帐户。但是,一旦用户通过其他方式进行了身份验证,就会提供方法来关联其他登录。

如果您不关心相对较小的安全风险,只需假设如果电子邮件与同一个人匹配,那么您只需修改AccountController.cs中的AccountController.cs以尝试通过电子邮件找到用户:

代码语言:javascript
复制
var user = await UserManager.FindByEmailAsync(loginInfo.Email);

然后签个名:

代码语言:javascript
复制
await SignInManager.SignInAsync(user);
票数 12
EN

Stack Overflow用户

发布于 2015-12-29 16:35:28

我完全赞同@Chris提出的观点,但我不确定所使用的代码是否足以满足OP的要求。

在ExternalLoginCallback中的默认块中添加此代码将完成以下工作

代码语言:javascript
复制
ApplicationUser user = await UserManager.FindByNameAsync(loginInfo.Email);
if (user != null)
{
    var addLoginResult = await UserManager.AddLoginAsync(user.Id, loginInfo.Login);
    if (addLoginResult.Succeeded)
    {
        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
        return RedirectToLocal(returnUrl);
    }
}
票数 20
EN

Stack Overflow用户

发布于 2017-02-11 21:59:39

这是我如何能够解决这个问题,你有。此解决方案将允许您使用电子邮件在网站上注册,如果您随后尝试使用谷歌登录同一电子邮件地址,则不会要求您注册,也不会产生任何错误;如果您在本地登录的电子邮件地址与您的Google帐户电子邮件相同,则允许您登录。我编辑了使用if / VS2015语句生成的默认VS2015代码,该语句检查与登录电子邮件匹配的现有电子邮件。我希望这对你的问题有所帮助,因为我有同样的问题,在任何地方都找不到答案。我的多个帖子请求被忽略了,谢天谢地,我从这篇文章中读到了一个答案,它让我找到了自己的解决方案,这个解决方案正在VS2015核心上为我工作。

代码语言:javascript
复制
[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
{       

    if (remoteError != null)
    {
        ModelState.AddModelError(string.Empty, $"Error from external provider: {remoteError}");
        return View(nameof(Login));
    }
    var info = await _signInManager.GetExternalLoginInfoAsync();
    if (info == null)
    {
        return RedirectToAction(nameof(Login));
    }            

    // Sign in the user with this external login provider if the user already has a login.
    var email = info.Principal.FindFirstValue(ClaimTypes.Email);
    var user = await _userManager.FindByNameAsync(email);
    if (user != null)
    {
        await _signInManager.SignInAsync(user, isPersistent: false);
        return RedirectToLocal(returnUrl);
    }
    else
    {
        // If user does not already exists, invite User to register.
        var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false);
        if (result.Succeeded)
        {
            _logger.LogInformation(5, "User logged in with {Name} provider.", info.LoginProvider);
            return RedirectToLocal(returnUrl);
        }

        if (result.RequiresTwoFactor)
        {
            return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl });
        }

        if (result.IsLockedOut)
        {
            return View("Lockout");
        }
        else
        {
            // If the user does not have an account, then ask the user to create an account.
            ViewData["ReturnUrl"] = returnUrl;
            ViewData["LoginProvider"] = info.LoginProvider;
            email = info.Principal.FindFirstValue(ClaimTypes.Email);
            return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = email });
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32680412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档