ASP.NET' FindByNameAsync'返回null?

时间:2016-09-16 00:31:24

标签: c# asp.net asp.net-identity

我对基础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);
}

4 个答案:

答案 0 :(得分:6)

您正在尝试通过电子邮件地址查找用户。

您应该使用UserManager.FindByEmailAsync

答案 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 并且不满足过滤条件时,可能会发生这种情况。