ASP.NET Core MVC为何不验证密码,且邮箱验证也失效?
Email与Password字段服务器端验证失效问题排查与解决
我的服务器端代码未对Email字段进行验证,同时Password字段的配置规则也未生效,相关代码如下:
页面标记(.cshtml)
<label asp-for="Email"></label> <input asp-for="Email" /> <span asp-validation-for="Email"></span> <br /> <label asp-for="Password"></label> <input asp-for="Password" /> <span asp-validation-for="Password"></span> <br />
模型类代码
[Required] [DataType(DataType.Password)] public string? Password { get; set; } [Required] [EmailAddress] public string? Email { get; set; }
Program.cs密码规则配置
builder.Services.Configure<IdentityOptions>(o => { o.Password.RequiredLength = 8; o.Password.RequireNonAlphanumeric = true; o.Password.RequireDigit = true; o.Password.RequireLowercase = true; o.Password.RequireUppercase = true; });
尝试过添加[StringLength]数据注解,同样无效。
以下是使用Password的业务代码片段:
com.CommandText = "Insert into users (name, email, password) " + "Values (@name, @email, @password);"; com.Parameters.AddWithValue("@name", acc.Name); var hashedpassword = helperMethods.HashPasword(acc.Password); com.Parameters.AddWithValue("@password", hashedpassword); dr.Close(); com.ExecuteNonQuery(); con.Close() ; return View("Views\Account\AccountCreated.cshtml"); }
解决步骤
触发服务器端模型验证
在处理请求的Action方法中,必须先检查ModelState.IsValid,验证不通过时返回视图,否则再执行数据库操作:[HttpPost] public IActionResult Register(YourAccountModel acc) { if (!ModelState.IsValid) { return View(acc); } // 后续数据库插入逻辑 }模型上的
[Required]、[EmailAddress]等注解仅在ModelState.IsValid检查时才会触发验证。Identity密码规则生效问题
配置的IdentityOptions密码规则仅对ASP.NET Core Identity框架的UserManager生效。如果是手动编写SQL插入用户,需要手动验证密码规则:- 方式一:改用
UserManager.CreateAsync创建用户,自动应用密码规则 - 方式二:手动使用
PasswordValidator验证:var passwordValidator = new PasswordValidator<IdentityUser>(); var validationResult = await passwordValidator.ValidateAsync(userManager, null, acc.Password); if (!validationResult.Succeeded) { foreach (var error in validationResult.Errors) { ModelState.AddModelError("Password", error.Description); } return View(acc); }
- 方式一:改用
排查
[StringLength]失效问题
确保[StringLength]注解正确应用在模型属性上,例如:[StringLength(100, MinimumLength = 8)] public string? Password { get; set; }同样需要配合
ModelState.IsValid检查才能生效。
内容的提问来源于stack exchange,提问作者Adude
相关产品推荐
相关产品推荐

