确认现有用户的电子邮件(其他人使用的电子邮件地址,社交登录)



第 1
部分 我有以下情况,我想知道我是否可以得到你的想法:

  • 杰克有帐户用户 1 和电子邮件 test@test.com
  • 杰克真的没有 test@test.com 或在注册时拼写错误
  • 吉尔来了,用Facebook登录 test@test.com

问题:

  1. 吉尔只是得到"user1"帐户吗? 因为毕竟这是她的电子邮件地址?
  2. 杰克会怎样?难道他只是丢了账就没办法了吗?

第 2 部分
目前正在将旧的网络表单应用程序转换为 asp.net 核心,我遇到的工作流程问题不仅仅是错误。 旧的Webforms应用程序从未验证过电子邮件地址。我想在登录时 asp.net 核心发送确认电子邮件。 问题是有些人可能使用了虚假电子邮件,电子邮件服务不再存在或一直在使用其他人的电子邮件地址(可能输入错误(。

示例
Person1 使用电子邮件 test@test.com 注册了帐户Person1(无法验证该电子邮件(Person2 想要使用电子邮件test@test.com注册Person2(因为他们确实拥有此电子邮件并且可以验证它(

问题1(人员 1 无法验证其电子邮件,因此无法登录。

2( Person2 无法注册,因为电子邮件已被占用,Person2 会忘记密码并发现它被 Person1 使用,然后能够以 Person1 身份登录。这并不理想,因为这不是他们的帐户

如何处理上述情况?

您可以选择定义如何管理这种情况。从技术上讲,这都是您的选择,因为外部身份验证将仅被视为外部令牌。这是默认的暗示(或者至少,在我的最新项目中如何处理它,不记得了(。

[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
{
if (remoteError != null)
{
return RedirectToAction(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 result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in with {Name} provider.", info.LoginProvider);
return RedirectToLocal(returnUrl);
}
else
{
var email = info.Principal.FindFirstValue(ClaimTypes.Email);
var isEmailAlreadyPresent = await _userManager.FindByEmailAsync(email);
if (isEmailAlreadyPresent == null)
{
var user = new User { UserName = email, Email = email };
var createUserResult = await _userManager.CreateAsync(user);
if (createUserResult.Succeeded)
{
createUserResult = await _userManager.AddLoginAsync(user, info);
if (createUserResult.Succeeded)
{
await _signInManager.SignInAsync(user, isPersistent: false);
_logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
return RedirectToLocal(returnUrl);
}
}
}
else
{
var addLoginAsyncResult = await _userManager.AddLoginAsync(isEmailAlreadyPresent, info);
if (!result.Succeeded)
{
}
await _signInManager.SignInAsync(isEmailAlreadyPresent, isPersistent: false);
_logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
return RedirectToLocal(returnUrl);
}
}
return RedirectToLocal(returnUrl);
}

如您所见,这实际上取决于您要如何实现它。如果你的问题涉及最好的方法,那么,这取决于你的哲学。但是你确定这种情况会经常发生,还是"以防万一"的情况?

我认为注册逻辑必须包含额外的步骤,

滥用报告链接
  • :如果拥有该电子邮件的第二个用户将注册并看到其电子邮件已注册,则必须有一个滥用报告链接。

  • 秘密问题
  • :另一种可能性是使用其他步骤进行密码重置,例如秘密问题(如果之前设置了甜菜(,或者有关先前活动的问题,以确保重置密码的人是帐户所有者

另一点是为老注册用户定义验证期限:

  • 应用程序升级后,必须通过电子邮件或内部消息通知所有注册用户,以验证其电子邮件地址。

  • 在此期间,用户必须能够不受限制地使用他的帐户。

  • 由于无法访问电子邮件而无法验证电子邮件的人,他们可以在给定的时间段内将电子邮件地址更改为新电子邮件地址。

  • 验证
  • 期结束后,未经验证的帐户可能会被暂停,直到通过验证,如果仍未验证,则可以将其删除。这样,您也可以从未使用的帐户中清除数据库。

相关内容

  • 没有找到相关文章

最新更新