如何在ASP.NET Core中修改用户密码规则及验证错误信息?
解决ASP.NET Core注册表单的密码验证问题
Got it,我来帮你搞定这两个密码验证的问题——毕竟ASP.NET Core和MVC 5的配置逻辑差不少,不用找web.config啦,全是代码层面的配置~
一、修改密码的特殊符号要求
ASP.NET Core Identity的密码规则是靠PasswordOptions配置的,如果要自定义允许的特殊符号范围,还可以加个自定义验证器。
1. 先搞定基础规则:要不要特殊符号
在你的Program.cs(.NET 6+用顶级语句,直接写这儿就行;老版本Startup.cs就放ConfigureServices里),找到Identity的配置代码,加上密码规则的配置:
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); // 配置密码规则 builder.Services.Configure<IdentityOptions>(options => { options.Password.RequireNonAlphanumeric = true; // 设为true就要求必须有特殊符号,false则取消这个要求 // 顺便可以调整其他规则,比如长度、大小写、数字要求 options.Password.RequiredLength = 8; options.Password.RequireDigit = true; options.Password.RequireLowercase = true; options.Password.RequireUppercase = true; });
2. 自定义允许的特殊符号范围
如果默认的“非字母数字”判断太宽泛,你只想允许@+*!这些特定符号,那就整个自定义密码验证器:
public class CustomPasswordValidator<TUser> : IPasswordValidator<TUser> where TUser : class { // 这里定义你允许的特殊符号 private readonly HashSet<char> _allowedSpecialChars = new HashSet<char> { '@', '+', '*', '!' }; public Task<IdentityResult> ValidateAsync(UserManager<TUser> manager, TUser user, string password) { var hasAllowedSpecialChar = password.Any(c => _allowedSpecialChars.Contains(c)); if (!hasAllowedSpecialChar) { return Task.FromResult(IdentityResult.Failed(new IdentityError { Code = "PasswordRequiresAllowedSpecialChar", Description = "密码必须包含至少一个指定的特殊符号:@+*!" })); } return Task.FromResult(IdentityResult.Success); } }
然后在Program.cs里注册这个验证器,让Identity用它:
builder.Services.AddScoped<IPasswordValidator<IdentityUser>, CustomPasswordValidator<IdentityUser>>();
二、修改验证提示错误信息
默认的错误提示是Identity内置的IdentityErrorDescriber生成的,咱们自定义这个类就能替换所有提示:
1. 写个自定义的ErrorDescriber
public class CustomIdentityErrorDescriber : IdentityErrorDescriber { // 替换“需要特殊符号”的提示 public override IdentityError PasswordRequiresNonAlphanumeric() { return new IdentityError { Code = nameof(PasswordRequiresNonAlphanumeric), Description = "密码必须包含至少一个特殊符号(如@+*!等)" }; } // 替换“需要小写字母”的提示 public override IdentityError PasswordRequiresLowercase() { return new IdentityError { Code = nameof(PasswordRequiresLowercase), Description = "密码必须包含至少一个小写字母(a-z)" }; } }
2. 注册这个自定义的Describer
回到Program.cs的Identity配置,加上一行注册代码:
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders() .AddErrorDescriber<CustomIdentityErrorDescriber>(); // 就是这行!
另外,如果你是在RegisterViewModel里用DataAnnotations做验证,也可以直接在属性上写自定义提示:
[Required(ErrorMessage = "请输入密码")] [DataType(DataType.Password)] // 正则表达式可以自定义规则,同时指定错误提示 [RegularExpression(@"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@+*!])[A-Za-z\d@+*!]{6,}$", ErrorMessage = "密码必须包含至少一个小写字母、大写字母、数字和指定特殊符号")] public string Password { get; set; }
这种方式适合直接在ViewModel里精细化控制验证规则和提示,和Identity的验证可以配合着用。
内容的提问来源于stack exchange,提问作者Sergey Bakotin
相关产品推荐
相关产品推荐

