如何更新的密码是从定义的模型不同的格式? 我越来越DbEntityValidationExcep

2019-10-22 14:22发布

问题

  • 我有一个预先定义的[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个字符。 这似乎是一个廉价的黑客,我觉得应该有一个更好的方式来做到这一点。 有任何想法吗?

Answer 1:

下面是一个例子:

我们已经得到了比我们的数据库需要用户输入不同的要求。 我们可能需要更多的用户输入,我们将在程序行事。

该EF模型

public class UserModel()
{
    [Key]
    public string Id { get; set; }

    public string Name { get; set; }

    [Required, StringLength(70)]
    public string Password { get; set; }
}

现在,这里是我们用来捕获用户输入的类

public class UserViewModel()
{
    [Required]
    public string Name { get; set; }

    [Required]
    [RegularExpression("^(?=.*[0-9])(?=.*[!@#$%^&*])[a-zA-Z0-9!@#$%^&*]", ErrorMessage = ErrorMessage_PasswordRegex)]
    public string Password { get; set; }

    [Required]
    public string ConfirmPassword { get; set; }
}

现在我们转变,映射值。

用户将不知道使用什么Id和数据库没有必要ConfirmPassword 。 我们还可以改变什么用户最初输入的密码。

[HttpPost]
public ActionResult Register(UserViewModel model)
{
    if ((ModelState.IsValid) &&
        (model.Password == model.ConfirmPassword))
    {
        // map to EF model
        var user = new UserModel
        {
            Name = model.Name,
            Password = e.encrypt(model.Password)  // transform, encrypt, whatever
        };

        db.Users.Add(user);  // use EF model to persist
        ...

        return RedirectToAction("Login", "Account");
    }
    return(model);
}


文章来源: How do I update a password that's in a different format from the defined model? I'm getting DbEntityValidationException