问题
- 我有一个预先定义的
[StringLength()]
和[RegularExpression()]
在我的代码,第一个模型的约束。 - 的
[StringLength()]
的要求是8-16个字符 - 的
[RegularExpression()]
约束的密码是在与加密密码不同的格式。- 密码被塞进数据库之前被加密。
- 加密的密码的长度,这是比在模型中定义的8-16个字符的限制更高70个字符。
- 我需要使用
e.Encrypt()
这意味着我不能使用默认的ASP.NET散列算法。
我已经搜查高和低,但还没有找到正确的答案。
我的代码
我有一个功能,允许用户注册一个帐号。 它看起来像这样:
[HttpPost]
public ActionResult Register([Bind(Include="Username,Password,EmailAddress")] UserModel user)
{
if (TryUpdateModel(user))
{
// Set password to a different format than Model's designated Regex
user.Password = e.Encrypt(user.Password);
context.Entry(user).State = EntityState.Added;
context.SaveChanges();
return RedirectToAction("Login", "Account");
}
return View();
}
在我UserModel.cs
文件,我有以下限制:
[Required]
[DataType(DataType.Password)]
[StringLength(16, MinimumLength = 8, ErrorMessage = "Must be between 8 and 16 characters.")]
[RegularExpression("^(?=.*[0-9])(?=.*[!@#$%^&*])[a-zA-Z0-9!@#$%^&*]", ErrorMessage = ErrorMessage_PasswordRegex)]
public string Password { get; set; }
再次,哈希密码是在一个完全不同的格式。 因此,因为它抛出一个我不能更新DbEntityValidationException
。 此[RegularExpression()]
是用于用户的密码的格式。 我需要能够绕过或暂停密码的正则表达式约束。
我做了什么来补救这种
我已经删除了[RegularExpression()]
的要求,并调升[StringLength()]
至70,这是我的密码哈希的长度。
不过,我不希望让用户输入文本的70个字符。 这似乎是一个廉价的黑客,我觉得应该有一个更好的方式来做到这一点。 有任何想法吗?