Linq以sql查询密码字段区分大小写

时间:2012-07-17 06:01:44

标签: asp.net sql asp.net-mvc-3

如何在Linq中将对Case敏感的查询写入sql。

我的查询是:

   var userResults = from u in Adm.Registrations   
                     where u.UserName == userName && u.Password ==  passWord 
                     select u;

谢谢,

3 个答案:

答案 0 :(得分:4)

永远不要将密码以纯文本形式存储在数据库或其他任何地方。决不。这很糟糕。

http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html

  

我的观点是,不要拖拽开发人员的好名字   Reddit透过泥泞。我们都很内疚。我相信每个开发人员   读这个已经将密码存储为纯文本   事业。我知道我有。忘记责任。重要的是要   告诉我们的同行,在数据库中存储明文密码是   严格禁止 - 有一种更好的方式,从基本开始   散列。

使用这些参考资料可帮助您确定最佳行动方案。皮肤这种猫有多种方法。我意识到改变你存储密码的方式不是你原来问题的直接答案,并且会涉及你自己的更多工作,但它会阻止更多的麻烦。

这是解决纯文本问题的非常全面的指南: http://www.codeproject.com/Articles/14537/The-Art-Science-of-Storing-Passwords

这些链接也很有启发性: Salting Your Password: Best Practices?

Non-random salt for password hashes

我希望这对最初的警告更有帮助。

答案 1 :(得分:2)

如果您尚未将数据库配置为执行区分大小写的比较,则需要在从数据库获取结果后在内存中执行比较。

var users = Adm.Registrations
               .Where(u => u.UserName == userName && u.Password == password)
               .ToList() // this will load data into memory
               // Now perform a case-sensitive query on the in-memory data
               .Where(u => u.UserName == userName && u.Password == password); 

另一种选择是更改数据库的排序规则以执行区分大小写的搜索,但要小心,因为这可能会导致获得的结果少于其他查询或存储过程中预期的结果。

答案 2 :(得分:0)

试试这个

var userResults = from u in Adm.Registrations 
                      where u.UserName .Equals(userName,StringComparison.InvariantCultureIgnoreCase) && u.Password.Equals(passWord,InvariantCultureIgnoreCase)
                      select u;