Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对DbSet调用密码设置器的查询_C#_Asp.net_Asp.net Mvc_Entity Framework_Asp.net Mvc 4 - Fatal编程技术网

C# 对DbSet调用密码设置器的查询

C# 对DbSet调用密码设置器的查询,c#,asp.net,asp.net-mvc,entity-framework,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,我有一个MVC4 web应用程序和一组用户。上下文初始值设定项使用密码“password”在数据库中播种一些示例用户。在用户中调用以下setter: private string _password; public string Password { get { return _password; } set { //Password checks here _password = Crypto.HashPassword(value);

我有一个MVC4 web应用程序和一组用户。上下文初始值设定项使用密码“password”在数据库中播种一些示例用户。在用户中调用以下setter:

private string _password;
public string Password {
    get { return _password; }

    set {
        //Password checks here
        _password = Crypto.HashPassword(value);
    }
}
密码会被很好地散列。 在AccountController的登录操作中,我首先从数据库中获取用户,然后检查是否输入了正确的密码:

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没有帮助

任何想法都非常感谢!
谢谢

好的,我不认为这是最干净的解决方案(因为我现在基本上有一个双设置器),但它至少工作得很好:-)


我假设FindBy方法中的
users
是DbSet。鉴于此,这只是一个猜测,但当EF从数据库检索数据时,它需要从底层结果集中获取数据并将其放入对象中。使用属性设置器初始化新创建的对象似乎是合理的。因此,当您说
users.FirstOrDefault
时,它从数据库中检索数据,包括哈希密码,创建一个新的
User
对象,并通过属性设置器对其进行初始化。是的,
users
是数据库集,很抱歉造成混淆。这就是问题所在,但我不知道如何以干净的方式解决它。。。我可以检查密码长度,如果它等于散列,不要散列它,但这不好。。。我无法检查
\u password
是否等于给定的
值(散列),因为
\u password
DbSet
初始化新的
用户
对象时丢失(
null
),您需要一个函数来散列密码,不应该在属性中执行此操作。我的意思是使用
Password=Crypto.HashPassword(你的密码)
你怎么能说它不是最干净的解决方案呢?您正在使用的实体是POCO实体(只是一个猜测)。对密码进行哈希不是password属性的作业,而是包含密码的对象的作业。Password属性不应该对传入的任何内容进行哈希处理。容器对象的工作是对所有成员的操作做出正确的决定。好的,这是有意义的!感谢您的澄清:-)
public string Password { get; set; }
public void SetPassword(string password) {
    //Password checks
    Password = Crypto.HashPassword(password);
}