我在 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)
返回预期的用户。
我已检查该电子邮件地址是否有效并且存在于数据库中
我正在使用 ASP.NET Core MVC 和 Identity。
使用
_userManager.FindByEmail
进行的其他操作似乎在应用程序的不同部分都能正常工作。我在 Register.cs
中使用来实现验证,以防止两个用户名使用相同的电子邮件地址注册。
我还验证了
UserManager
正在被注入到我的 ResetPassword
类的构造函数中。我在这里看到了其他类似的答案,但这些建议没有帮助。
(编辑),如果我像这样在 userManager 上使用用户名
var user = wait _userManager.FindByNameAsync(“用户名”);
如果用户名存在,上面将返回正确的用户。但这并不理想,因为我在重置密码时无法获取用户名。
任何有关可能导致此问题的原因的见解或建议将不胜感激。谢谢!
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 如上面的屏幕截图所示。