为什么ASP.NET Core Identity配置的密码验证规则完全不生效?
问题原因
- 调用了错误的
UserManager.CreateAsync重载
你在注册逻辑里手动对密码做了哈希,调用的是仅传入用户实体的CreateAsync重载,该重载设计用于已完成密码哈希的场景,不会触发任何内置密码校验逻辑。 ModelState不会自动校验Identity密码规则
你定义的RegisterBindingModel仅给Password字段加了[Required]注解,Identity的密码规则属于业务逻辑层校验,不会自动作用于模型绑定校验阶段,所以只要密码不为空ModelState.IsValid就会返回true。
修复方案
1. 修改注册逻辑代码
删掉手动哈希密码的代码,改用带明文密码参数的CreateAsync重载,该重载会自动执行所有配置好的密码校验,校验通过后自动完成密码哈希存储:
// 删除这两行代码 // user.PasswordHash = _passwordHasher.HashPassword(user, model.Password); // IdentityResult result = await _userManager.CreateAsync(user); // 替换为以下代码 IdentityResult result = await _userManager.CreateAsync(user, model.Password);
2. 修正配置文件格式错误
你appsettings.json中的Lockout配置项名称末尾多了多余空格,会导致配置绑定失败,修正为:
"Lockout": { "AllowedForNewUsers": true, "MaxFailedAccessAttempts": 5, "DefaultLockoutTimeSpan": "00:05:00" }
补充说明
不需要手动调用IPasswordValidator的校验方法,UserManager的带密码参数的CreateAsync重载内部会自动遍历所有已注册的密码校验器执行校验,校验不通过会直接返回带对应错误信息的IdentityResult。
内容的提问来源于stack exchange,提问作者ackh
相关产品推荐
相关产品推荐

