我有一个问题与ForgotPassword
方法的基础asp.net身份。当逐步执行代码时,行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);
}
这通常发生在您使用Microsoft.AspNetCore.Identity.UserManager中的CreateAsync的其他方法创建用户时。我有同样的问题,因为我直接通过EF创建用户,而不是引用的方法。
所有FindBy方法使用这种方法应该能正常工作
您正在尝试通过电子邮件地址查找用户。
你应该使用UserManager。FindByEmailAsync
我在基于ASP的项目中遇到了类似的问题。. NET Core 2.2。也许我的解决方案会对某人有用。
用户可以在UserProfile组件中更改其UserName
(默认情况下,UserName
与Email相同,即user1@mail.com
)。如果用户将配置文件中的用户名从默认的user1@mail.com
更改为user1
,则他们不能使用这个新用户名登录,只能使用Email。
下面这行总是返回NULL。
var user = await _userManager.FindByNameAsync(request.UserName);
在调查了AspCore存储库之后,我找到了FindByNameAsync方法。我开始怀疑NormalizeName
线。我当前的UserProfile
模型只有UserName
属性,后来使用Automapper将其映射并保存到数据库中。因此,我添加了computed 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的问题。
当User表应用了查询过滤器,并且不满足过滤条件时,就会发生这种情况。