第 1 部分
我有以下情况,我想知道是否可以了解您的想法:
- Jack 拥有帐户 user1,电子邮件地址为 [email protected]
- jack 确实没有[email protected]或者注册时拼写错误
- Jill 出现并使用 Facebook 登录 [email protected]
问题:
- Jill 刚刚获得“user1”帐户吗?因为毕竟这是她的电子邮件地址?
- jack 怎么了?他刚刚失去了帐户吗?
第 2 部分
我目前正在将旧的 Webforms 应用程序转换为 ASP.NET Core,并且我遇到的工作流程问题不仅仅是错误。
旧的 Webforms 应用程序从未经过验证的电子邮件地址。我想在登录时向 asp.net core 发送确认电子邮件。
问题是,有些人可能使用了虚假电子邮件,电子邮件服务不再存在或使用了其他人的电子邮件地址(可能输入错误)。
示例
Person1 使用电子邮件 [email protected] 注册了帐户 Person1 (无法验证该电子邮件)
Person2 想要通过电子邮件 [email protected] 与 Person2 注册(因为他们确实拥有此电子邮件并且可以验证)
问题 1) 第一个人无法验证他们的电子邮件,他们将无法登录。
2) Person2 无法注册,因为电子邮件已被占用,Person2 忘记了密码,发现其密码被 Person1 使用,然后能够以 Person1 身份登录。这并不理想,因为这并不是他们的帐户
以上情况该如何处理?
最佳答案
您可以选择定义如何管理这种情况。从技术上讲,这都是您的选择,因为外部身份验证将仅被视为外部 token 。这是默认的实现(或者至少在我最新的项目中是如何处理的,不记得了)。
[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);
}
正如您所看到的,这实际上取决于您想要如何实现它。如果你的问题涉及最好的方法,那么,这取决于你的哲学。但你确定这种情况会经常发生,还是只是“以防万一”的情况?
关于asp.net-mvc - 确认现有用户的电子邮件(其他人使用的电子邮件地址、社交登录),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52416571/