asp.net-mvc - 确认现有用户的电子邮件(其他人使用的电子邮件地址、社交登录)

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

第 1 部分
我有以下情况,我想知道是否可以了解您的想法:

问题:

  1. Jill 刚刚获得“user1”帐户吗?因为毕竟这是她的电子邮件地址?
  2. 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/

相关文章:

jquery - 自动完成应用值而不是标签到文本框

asp.net-core - HttpContext.Items 与范围服务

asp.net-core - 为什么 Visual Studio 2019 16.9.5 中 .NET Core 3.1 和 .NET 5 的 Scaffolding Identity 失败?

asp.net-identity - 如何设置 IdentityResult?

c# - 当我使用 ASP.NET MVC 5 在服务器上部署时出现 JSON 404 错误

c# - 当前不会命中断点,因为 Razor 代码中的源代码不同

c# - 找不到对象 "dbo.Table",因为它不存在或您没有权限

c# - Asp.net 核心 - 未找到 dotnet 测试

asp.net-core - 从 ASP.NET Core 3.1 升级到 ASP.NET 5.0 后 User.Claims 为空

c# - AspNetCore 2.1 Bearer Token Authentication - 当前用户为空