Pro*_*ofK 12 asp.net-mvc facebook oauth asp.net-mvc-5 google-oauth2
我刚刚按照本文中的说明操作中的说明将Google添加为我的MVC 5应用程序的登录提供程序.一切似乎都运行正常,但当我通过谷歌登录时,它希望我在我的应用程序中注册Google提供的电子邮件/用户名作为新帐户.如果我按原样保留电子邮件并单击"注册"按钮,它会告诉我该地址已被占用,因为我之前已在我的应用程序自己的登录提供程序上注册.
如何调整MVC项目模板生成的默认代码以允许我将Google登录与现有本地帐户相关联?
PS我和Facebook有完全相同的问题.
Sou*_*bes 13
我完全赞同@Chris Pratt提出的观点但是我不确定使用的代码是否足以完成OP所要求的.
在ExternalLoginCallback内的默认块中添加此代码应该可以完成这项工作
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为Identity会按照它的目的来处理它,因为没有真正的方法可以通过来自第三方的电子邮件来验证用户的身份.虽然风险可能相对较低,但有人可能会使用不属于他们的电子邮件地址与Facebook等第三方创建帐户,然后使用该第三方登录模拟其他网站上的帐户附在同一封电子邮件中.
因此,Identity仅允许您在登录时使用外部登录创建新帐户,而不是附加到现有帐户.但是,一旦用户通过其他方式进行身份验证,就会提供方法来关联其他登录.
如果你不关心的只有假设如果邮件匹配它是同一个人,那么你只需要修改相关的相对温和的安全风险ExternalLoginCallback在AccountController.cs试图找到电子邮件的用户:
var user = await UserManager.FindByEmailAsync(loginInfo.Email);
Run Code Online (Sandbox Code Playgroud)
然后在以下位置签名:
await SignInManager.SignInAsync(user);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5747 次 |
| 最近记录: |