我有一个MVC4 web应用程序与DbSet的用户。Context初始化器在数据库中使用密码"password"播种一些示例用户。下面的setter在User中被调用:
private string _password;
public string Password {
get { return _password; }
set {
//Password checks here
_password = Crypto.HashPassword(value);
}
}
密码散列很好。在AccountController的Login操作中,我首先从数据库中获取User,然后检查是否输入了正确的密码:
User u = repos.FindBy(model.Email);
if (ModelState.IsValid && g != null && u.IsPasswordCorrect(model.Password)) {
FindBy这样做:
return users.FirstOrDefault(u => u.Email.Equals(email))
用户被发现很好,但是我通过调试发现,这个对DbSet的查询调用用户的密码设置器,并将散列密码作为值??所以密码被哈希两次…第一次是在使用密码"password"为示例用户提供种子时,第二次是在该查询使用已经散列的值调用它时。这就是为什么IsPasswordCorrect失败,我无法登录。: - (
根据这个DbContext调用setter来初始化dbset,但是为什么当我查询它时调用它?把它设为私有setter并没有帮助。
任何想法都非常感谢!由于
好吧,我不认为这是最干净的解决方案(因为我现在基本上有一个双setter),但它至少工作得很好:-)
public string Password { get; set; }
public void SetPassword(string password) {
//Password checks
Password = Crypto.HashPassword(password);
}