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

时间:2018-09-20 02:12:20

标签: asp.net-mvc asp.net-core asp.net-identity

PART 1
我有以下情况,我想知道是否能得到您的想法:

  • Jack的帐户user1带有电子邮件test@test.com
  • Jack确实没有test@test.com或在注册时误将其拼错
  • Jill出现并通过Facebook test@test.com登录

问题:

  1. Jill是否只获得“ user1”帐户?因为毕竟是她的电子邮件地址?
  2. 杰克怎么办?他只是失去了帐户吗?

PART 2
我目前正在将一个旧的Webforms应用程序转换为asp.net核心,并且遇到的工作流程问题不仅仅是一个错误。 旧的Webforms应用程序从未验证过电子邮件地址。我想在登录后向asp.net核心发送确认电子邮件。 问题是某些人可能会使用伪造的电子邮件,该电子邮件服务不再存在或正在使用其他人的电子邮件地址(可能是输入错误)。

示例
Person1使用电子邮件 test@test.com 注册了帐户 Person1 (无法验证该电子邮件)
Person2希望通过电子邮件 test@test.com Person2 进行注册(因为他们确实拥有此电子邮件,并且可以对其进行验证)

问题 1)1号用户无法验证他们的电子邮件,他们将无法登录。

2)Person2无法注册,因为已经接收了电子邮件,Person2忘记了密码,发现Person1使用了该密码,然后可以以Person1身份登录。这不是理想的选择,因为它实际上不是他们的帐户

如何处理以上情况?

2 个答案:

答案 0 :(得分:1)

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

[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);
}

如您所见,它实际上取决于您要如何实现它。而且,如果您的问题涉及最佳解决方案,那么这取决于您的理念。但是您确定这种情况会经常发生吗?还是“以防万一”的情况?

答案 1 :(得分:1)

我认为注册逻辑必须包含其他步骤,

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

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

另一点是为旧的注册用户定义验证期:

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

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

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

  • 验证期结束后,可以暂停未验证的帐户,直到验证完成为止;如果仍未验证,则可以将其删除。这样,您还可以清除未使用的帐户中的数据库。