我对基础asp.net标识的ForgotPassword
方法存在问题。当单步执行代码时,行var user = await UserManager.FindByNameAsync(model.Email);
会返回null
,即使我已确认用户的电子邮件地址存在于aspnetusers
表中。我不确定为什么Visual Studio不允许我进入FindByNameAsync
方法?不确定这里发生了什么?
public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindByNameAsync(model.Email);
if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
{
// Don't reveal that the user does not exist or is not confirmed
return View("ForgotPasswordConfirmation");
}
var code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
var callbackUrl = Url.Action("ResetPassword", "Account",
new { UserId = user.Id, code = code }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(user.Id, "Reset Password",
"Please reset your password by clicking here: <a href=\"" + callbackUrl + "\">link</a>");
return View("ForgotPasswordConfirmation");
}
// If we got this far, something failed, redisplay form
return View(model);
}
答案 0 :(得分:6)
您正在尝试通过电子邮件地址查找用户。
答案 1 :(得分:2)
对于基于ASP.NET Core 2.2的项目,我遇到了类似的问题。也许我的解决方案对某人有用。
用户可以在UserProfile组件中更改其UserName
(默认情况下,UserName
与电子邮件相同,即user1@mail.com
)。如果用户将配置文件中的用户名从默认的user1@mail.com
更改为user1
,则他们将无法使用该新用户名(仅电子邮件)登录。
下面的行始终返回NULL。
var user = await _userManager.FindByNameAsync(request.UserName);
调查了AspCore存储库后,我发现了FindByNameAsync method。我对NormalizeName
行感到怀疑。而且我目前的UserProfile
模型仅具有UserName
属性,该属性随后使用 Automapper 进行了映射并保存到数据库中。因此,我添加了计算的NormalizedUserName
属性,并使用 Automapper (_mapper.Map(UserProfileModel, dbUser);
)将其映射并将其保存到数据库中。
public string NormalizedUserName
{
get
{
return UserName.ToUpper().Normalize(); // `UserManager` UserFindByNameAsync method is using `normalizedName` = `NormalizedUserName` from Users table (for some reason UPPERCASE, maybe SQL performance), otherwise we will always get NULL
}
}
使用FindByNameAsync
方法时,上述更改解决了我的NULL问题。
答案 2 :(得分:1)
当您使用 Microsoft.AspNetCore.Identity.UserManager 中的 CreateAsync 以外的其他方法创建用户时,通常会发生这种情况。我遇到了同样的问题,因为我是直接通过EF创建用户的,而不是通过引用的方法创建的。
所有FindBy方法都应使用此方法正常工作。
答案 3 :(得分:0)
当用户表应用了 Query Filter 并且不满足过滤条件时,可能会发生这种情况。