You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 8 Web API种子用户无法登录,注册用户可正常登录

ASP.NET Core 8 Identity种子用户无法登录的问题排查与修复

核心问题分析

你的种子代码存在两个关键问题,直接导致Identity验证失败:

  1. NormalizedUserName与UserName不匹配
    Admin用户的UserName是testadmin@testdomain.com,但NormalizedUserName被硬编码为ADMIN。Identity验证时会将用户输入的用户名/邮箱标准化(转大写),再与数据库中的NormalizedUserName或NormalizedEmail匹配,这里标准化后的正确值应为TESTADMIN@TESTDOMAIN.COM,硬编码的ADMIN导致系统找不到对应用户。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:48:13