ASP.NET Core中OnModelCreating配置种子用户后PasswordSignInAsync始终失败求助
问题原因及修复方案
- NormalizedUserName字段赋值错误
ASP.NET Core Identity 中的NormalizedUserName是用户名的标准化大写版本,用于不区分大小写的用户名匹配,而非用户的显示姓名。你当前赋值为"John Smith",但实际用户名是邮箱john.smith@example.com,登录时SignInManager会将输入的用户名转为全大写后和数据库的NormalizedUserName匹配,完全对不上自然校验失败。
修复:将NormalizedUserName的值改为"JOHN.SMITH@EXAMPLE.COM",或者调用 Identity 自带的ILookupNormalizer来标准化字符串,避免手动写死出错。 - NormalizedEmail字段赋值错误
同理,NormalizedEmail也需要是邮箱的全大写版本,你当前填的是原始小写邮箱,后续如果用到邮箱校验的逻辑也会出错,修复改为"JOHN.SMITH@EXAMPLE.COM"即可。 - PasswordHasher 实例化不符合预期
你直接手动new PasswordHasher<ApplicationUser>()创建哈希实例,没有使用依赖注入容器中由 Identity 初始化的实例。如果你的项目配置了自定义的密码哈希规则(比如指定哈希算法版本、加盐规则),手动创建的实例生成的哈希值,和SignInManager校验时用的哈希规则不一致,会导致密码校验永远失败。
修复:不要在种子数据配置里直接生成哈希值,推荐两种方案:1. 先启动项目用注册接口创建一次测试用户,把数据库里生成的PasswordHash值复制过来填到种子数据里;2. 迁移种子数据时通过依赖注入拿到IPasswordHasher<ApplicationUser>实例后再生成哈希。另外你调用HashPassword时第一个参数传了null,部分自定义哈希实现会读取用户实例属性参与哈希计算,也可能导致异常,最好传入你正在初始化的ApplicationUser实例。 - 种子数据未实际写入数据库
确认你写完OnModelCreating的种子配置后,已经执行了迁移命令(Add-Migration+Update-Database),把配置的用户数据真正插入到了数据库中,避免数据库里根本不存在这条测试用户。
内容的提问来源于stack exchange,提问作者Kestal
相关产品推荐
相关产品推荐

