C# 为什么FindByNameAsync总是返回null?

C# 为什么FindByNameAsync总是返回null?,c#,authentication,asp.net-core,.net-core,entity-framework-core,C#,Authentication,Asp.net Core,.net Core,Entity Framework Core,试图通过post请求对令牌进行身份验证时,当我通过用户名进行检查时,用户总是返回null public async Task<IActionResult> Login([FromBody] LoginModel model) { var user = await _userManager.FindByNameAsync(model.UserName); // user always equals null here if (user !

试图通过post请求对令牌进行身份验证时,当我通过用户名进行检查时,用户总是返回null

    public async Task<IActionResult> Login([FromBody] LoginModel model)
    {
        var user = await _userManager.FindByNameAsync(model.UserName); // user always equals null here
        if (user !=null && await _userManager.CheckPasswordAsync(user,model.UserName))
        {
            var claims = new[]
            {
                new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
            };

            var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("MySuperSecureKey"));

            var token = new JwtSecurityToken(
                issuer: "http://blah.com",
                audience: "http://blah.com",
                expires: DateTime.UtcNow.AddHours(1),
                claims: claims,
                signingCredentials: new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256)
            );

            return Ok(new
            {
                token = new JwtSecurityTokenHandler().WriteToken(token),
                expiration = token.ValidTo
            });
        }

        return Unauthorized();
    }
公共异步任务登录([FromBody]登录模型)
{
var user=await _userManager.FindByNameAsync(model.UserName);//此处user始终等于null
if(user!=null&&await\u userManager.CheckPasswordAsync(user,model.UserName))
{
风险值索赔=新[]
{
新声明(JwtRegisteredClaimNames.Sub,user.UserName),
新声明(JwtRegisteredClaimNames.Jti,Guid.NewGuid().ToString()),
};
var-signingKey=new-SymmetricSecurityKey(Encoding.UTF8.GetBytes(“MySuperSecureKey”);
var token=新的JwtSecurityToken(
发行人:“http://blah.com",
听众:“http://blah.com",
过期时间:DateTime.UtcNow.AddHours(1),
索赔:索赔,
signingCredentials:新的signingCredentials(signingKey,SecurityAlgorithms.HmacSha256)
);
返回Ok(新的
{
token=new JwtSecurityTokenHandler().WriteToken(令牌),
expiration=token.ValidTo
});
}
未经授权返回();
}
想知道问题是否来自于我如何用这个虚拟数据类来播种我的数据库

public class DummyData
{
    public static void Initialize(IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
        {
            var context = serviceScope.ServiceProvider.GetService<HealthContext>();
            var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
            context.Database.EnsureCreated();
            //context.Database.Migrate();

            // Look for any ailments
            if (context.Ailments != null && context.Ailments.Any())
                return;   // DB has already been seeded

            var ailments = GetAilments().ToArray();
            context.Ailments.AddRange(ailments);
            context.SaveChanges();

            var medications = GetMedications().ToArray();
            context.Medications.AddRange(medications);
            context.SaveChanges();

            var patients = GetPatients(context).ToArray();
            context.Patients.AddRange(patients);
            context.SaveChanges();

            if (!context.Users.Any())
            {
                ApplicationUser user = new ApplicationUser()
                {

                    Email = "andy@stav.com",
                    SecurityStamp = Guid.NewGuid().ToString(),
                    UserName = "AndyCosStav"

                };
                userManager.CreateAsync(user, "Password123");
                context.Users.Add(user);
                context.SaveChanges();
            }

        }
    }
公共类DummyData
{
公共静态无效初始化(IApplicationBuilder应用程序、IServiceProvider服务提供商)
{
使用(var serviceScope=app.ApplicationServices.GetService().CreateScope())
{
var context=serviceScope.ServiceProvider.GetService();
var userManager=serviceProvider.GetRequiredService();
context.Database.recreated();
//Migrate();
//看看有没有病
if(context.Ailments!=null&&context.Ailments.Any())
return;//数据库已经被植入种子
var-ailments=GetAilments().ToArray();
context.Ailments.AddRange(疾病);
SaveChanges();
var药物=GetMedicines().ToArray();
上下文。药物。添加范围(药物);
SaveChanges();
var patients=GetPatients(context.ToArray();
context.Patients.AddRange(患者);
SaveChanges();
如果(!context.Users.Any())
{
ApplicationUser用户=新的ApplicationUser()
{
电子邮件=”andy@stav.com",
SecurityStamp=Guid.NewGuid().ToString(),
UserName=“AndyCosStav”
};
CreateAsync(用户,“Password123”);
context.Users.Add(用户);
SaveChanges();
}
}
}

在我为数据库设定种子后,我可以看到用户在字段中创建的数据库,它的defo在那里,因此不理解这里的问题是什么!

第一件事是检查数据库以确认用户是否成功创建。您可以先检查几个问题:

  • 对于
    userManager.FindByNameAsync
    确认您键入的是
    和ycosstav
    ,而不是电子邮件

  • CheckPasswordAsync
    返回一个标志,指示给定密码对指定用户是否有效

    public virtual System.Threading.Tasks.Task<bool> CheckPasswordAsync (TUser user, string password);
    
  • Password123
    可能与defalut ASP.NET核心身份密码不匹配 限制,您必须至少有一个非字母数字字符


  • 即使您在该行之后主动等待几秒钟(可能是使用调试器),用户是否为空?是的,无论我等待多长时间,它始终为空
    if (user !=null && await _userManager.CheckPasswordAsync(user,model.UserName))