ASP.NET Core MVC _userManager.FindByEmailAsync(Input.Email) 返回 null,尽管现有用户具有相同的电子邮件

问题描述 投票:0回答:1

我在 ASP.NET Core MVC 应用程序中实现密码重置功能时遇到问题。将重置令牌发送到用户的电子邮件并单击链接设置新密码后,我发现该行

var user = await _userManager.FindByEmailAsync(Input.Email);

在我的

ResetPassword
类中总是返回
null
,即使我已经确认存在具有相同电子邮件的用户。我通过首先检索所有用户,然后使用 lambda 表达式检查集合来验证确实存在具有指定电子邮件地址的用户:

var allUsers = _userManager.Users.ToListAsync();
var user = allUsers.FirstOrDefault(x => x.Email == Input.Email);

但这也会为用户返回

null
。我尝试做的下一件事是使用 foreach 循环迭代用户列表,以手动验证是否存在不同数据类型的问题。我发现当我比较两封电子邮件时,
string.Compare()
string1 == string2
表达式总是返回 false。即使两者完全相同,或者即使我事先规范了输入电子邮件。

foreach (var us1 in allUsers)
{
    if (us1.Email.ToLower() == Input.Email.ToLower())
    {
        // Breakpoint ... Found ... I never get to this breakpoint 
    }
}

奇怪的是,我在

_userManager
类中使用
Register
,并且
_userManager.FindByEmailAsync(Input.Email)
返回预期的用户。

  1. 我已检查该电子邮件地址是否有效并且存在于数据库中

  2. 我正在使用 ASP.NET Core MVC 和 Identity。

  3. 使用

    _userManager.FindByEmail
    进行的其他操作似乎在应用程序的不同部分都能正常工作。我在
    Register.cs
    中使用来实现验证,以防止两个用户名使用相同的电子邮件地址注册。

  4. 我还验证了

    UserManager
    正在被注入到我的
    ResetPassword
    类的构造函数中。我在这里看到了其他类似的答案,但这些建议没有帮助。

  5. (编辑),如果我像这样在 userManager 上使用用户名

var user = wait _userManager.FindByNameAsync(“用户名”);

如果用户名存在,上面将返回正确的用户。但这并不理想,因为我在重置密码时无法获取用户名。

任何有关可能导致此问题的原因的见解或建议将不胜感激。谢谢!

c# asp.net-core-mvc claims-based-identity asp.net-core-identity
1个回答
0
投票

ASP.NET Core MVC _userManager.FindByEmailAsync(Input.Email) 返回 尽管现有用户具有相同的电子邮件,但仍为空

根据您的场景和描述以及共享代码片段,您似乎已经完成了我们应该完成的大部分步骤。

例如,您说您已经确认已检查过的电子邮件大小写敏感度,

此外,您已经检查过您的电子邮件是否存在于数据库中,并且该电子邮件也来自用户表单提交的正确信息。

除此之外,您还检查了

_userManager.FindByEmail
在注册用户时获取正确的值。到目前为止一切顺利。

尽管如此,您已经成功完成了大部分初始故障排除,并且我相信,在我们最后很难重现您的场景,因为我通过以下方法获得了预期值:

    [HttpPost]
    public async Task<IActionResult> ForgotPassword(ForgotPasswordViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = await _userManager.FindByEmailAsync(model.Email);
            if (user != null)
            {
                var token = await _userManager.GeneratePasswordResetTokenAsync(user);
                var callbackUrl = Url.Action("ResetPassword", "ResetPassword", new { userId = user.Id, token }, protocol: HttpContext.Request.Scheme);
                await _emailSender.SendEmailAsync(model.Email, "Reset Password", $"Please reset your password by clicking here: {callbackUrl}");
                return View("ForgotPasswordConfirmation");
            }

           
            return View("ForgotPasswordConfirmation");
        }

        return View(model);
    }

但是,在检查数据库连接字符串和其他配置后,如果您发现一切都正确,您仍然收到空电子邮件响应。然后,作为解决方法,您可以从 AspNetUsers 表(包含所有应用程序用户信息的身份表)检查,我们也可以直接检查 AspNetUsers 表。您可以执行以下操作:

bool emailExists = await _context.AspNetUsers.AnyAsync(em => em.Email == userModel.UserEmail);

注意: 我将表名称保留为 AspNetUsers,只需将其替换为您的表名称即可。如您所见,我的 DbContext 如上面的屏幕截图所示。

© www.soinside.com 2019 - 2024. All rights reserved.