我正在使用Entity Framework 4.我不确定设置用户密码的责任在哪里。我想像SetPassword(User user, string password)
那样在Repository上考虑过。但这似乎不对。
主要问题是它不能只是一个简单的属性设置器,因为我也返回生成的盐。
答案 0 :(得分:3)
您可能希望创建某种类型的模块来处理要调用的User类的密码创建。这更符合单一责任原则(一个班级应该只有一个责任,有时读作“只有一个改变的理由”)。
由于您的密码应该在被保留之前被加盐和散列,这肯定超出了用户应该做的范围。 然后,您可以使用一个模块与User分开,以使用相同的salt和hash方法验证密码。
答案 1 :(得分:2)
您可以引入Password
课程。 Password
类的User
属性应为Password
,而不是string
。
public class User
{
public Password Password { get; set; }
}
public class Password
{
private string value;
private string salt;
public Password(string value)
{
this.salt = "generated salt";
this.value = value;
}
public string ToHashedString()
{
// Return the hashed password.
}
}
Password
类可能负责生成盐本身。您还可以引入使用其他依赖项生成salt并构造PasswordService
实例的Password
。
答案 2 :(得分:1)
它不应该在Repository中,因为它应该仅用于数据库访问而不是用于业务逻辑。我认为它应该在User类中。
public class User
{
IUserPasswordManager _userPasswordManager;
public string SetPassword(string oldPassword, string newPassword)
{
//Set password and return salt
return _userPasswordManager.SetPasswordForUser(this, oldPassword, newPAssword);
}
}