ASP.NET Core 8 Web API种子用户无法登录,注册用户可正常登录
ASP.NET Core 8 Identity种子用户无法登录的问题排查与修复
核心问题分析
你的种子代码存在两个关键问题,直接导致Identity验证失败:
NormalizedUserName与UserName不匹配
Admin用户的UserName是testadmin@testdomain.com,但NormalizedUserName被硬编码为ADMIN。Identity验证时会将用户输入的用户名/邮箱标准化(转大写),再与数据库中的NormalizedUserName或NormalizedEmail匹配,这里标准化后的正确值应为TESTADMIN@TESTDOMAIN.COM,硬编码的ADMIN导致系统找不到对应用户。Staff用户的UserName与Email不一致
Staff用户的UserName是Staff,但Email是Staff@testdomain.COM,这和注册接口的逻辑(通常将邮箱设为用户名)不一致。若系统优先匹配NormalizedUserName,用户用邮箱登录时会直接匹配失败。
另外,生成密码哈希时传递null作为用户对象,虽不会直接导致登录失败,但不符合Identity设计规范,建议传递对应用户实例。
修复后的种子代码
private void SeedUsers(ModelBuilder modelBuilder) { // 种子角色 modelBuilder.Entity<IdentityRole>().HasData(new IdentityRole { Id = "2c5e174e-3b0e-446f-86af-483d56fd7210", Name = "Administrator", NormalizedName = "ADMINISTRATOR" }); modelBuilder.Entity<IdentityRole>().HasData(new IdentityRole { Id = "8cc980c3-8643-4166-8dcb-de924036ec6b", Name = "Staff", NormalizedName = "STAFF" }); var hasher = new PasswordHasher<IdentityUser>(); // 种子Admin用户 var adminUser = new IdentityUser { Id = "8e445865-a24d-4543-a6c6-9443d048cdb9", UserName = "testadmin@testdomain.com", Email = "testadmin@testdomain.com", NormalizedEmail = "TESTADMIN@TESTDOMAIN.COM", NormalizedUserName = "TESTADMIN@TESTDOMAIN.COM", // 修正为UserName的大写 LockoutEnabled = false, EmailConfirmed = true, SecurityStamp = Guid.NewGuid().ToString() // 添加SecurityStamp,符合Identity规范 }; adminUser.PasswordHash = hasher.HashPassword(adminUser, "Test12345!@"); modelBuilder.Entity<IdentityUser>().HasData(adminUser); modelBuilder.Entity<IdentityUserRole<string>>().HasData( new IdentityUserRole<string> { RoleId = "2c5e174e-3b0e-446f-86af-483d56fd7210", UserId = "8e445865-a24d-4543-a6c6-9443d048cdb9" }); // 种子Staff用户,保持UserName与Email一致 var staffUser = new IdentityUser { Id = "d18e858a-c38d-4083-99b6-c5697b81d7cd", UserName = "Staff@testdomain.COM", // 改为与Email一致 Email = "Staff@testdomain.COM", NormalizedEmail = "STAFF@TESTDOMAIN.COM", NormalizedUserName = "STAFF@TESTDOMAIN.COM", // 修正为UserName的大写 EmailConfirmed = true, SecurityStamp = Guid.NewGuid().ToString() }; staffUser.PasswordHash = hasher.HashPassword(staffUser, "Test12345!@"); modelBuilder.Entity<IdentityUser>().HasData(staffUser); modelBuilder.Entity<IdentityUserRole<string>>().HasData( new IdentityUserRole<string> { RoleId = "8cc980c3-8643-4166-8dcb-de924036ec6b", UserId = "d18e858a-c38d-4083-99b6-c5697b81d7cd" }); }
额外注意事项
- 修改代码后,需重新生成并应用迁移,确保数据库数据更新:
Add-Migration FixSeedUserNormalizedFields Update-Database - 若已执行过旧迁移,可直接修改数据库中
NormalizedUserName字段,避免数据冲突。
内容的提问来源于stack exchange,提问作者dotnetdevcsharp
相关产品推荐
相关产品推荐

