如何匹配区分大小写的用户名和密码
Posted
技术标签:
【中文标题】如何匹配区分大小写的用户名和密码【英文标题】:How to match case-sensitive username and password 【发布时间】:2020-05-01 21:41:33 【问题描述】:我正在尝试使用 sql server 在 C# 中使用 linq 匹配用户名和密码
//verify the user.
var UserDetails =
(from user in con.ios_Users
where (user.LOGIN == LogReq.userName && user.PASSWORD == LogReq.password && user.ACTIVE != 0)
select new
user.ID,
user.TYPEDESCR,
user.USERNAME
).ToList();
在上面的代码中,如果我传递用户名 - demo 和密码 - demo123 但在数据库中用户名是 - DeMo 和密码是 DeMo123,它会返回数据用户数据 如何使这个 linq 查询区分大小写:(
提前致谢:)
【问题讨论】:
尝试使用 Equals 方法。user.PASSWORD.Equals(LogReq.password)
强制性的,fwiw,不要将密码以明文形式存储在数据库中——或者任何地方
@Dumisani :尝试了您的代码,它返回的数据不区分大小写:(
最好不要存储实际密码,而是存储它的哈希值。那么至少会区分大小写
拜托拜托:现在停止;这是一个严重的安全问题,而不是微不足道的问题,并且您仅通过拥有这些数据就对您的用户造成了积极的伤害;您不得出于身份验证的目的存储密码 - 这不是您进行身份验证的方式;如果这是一个学生项目(我们偶尔会看到),请借此机会告诉你的老师/讲师他们错了(如果你愿意,可以发给我;我很好!);如果这是“真实”的东西,STOOOOOPP;这是非常非常错误的。
【参考方案1】:
看起来像是数据库排序问题:https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver15
SQL Server 中的排序规则为您的数据提供排序规则、区分大小写和区分重音的属性。与字符数据类型(例如 char 和 varchar)一起使用的排序规则规定了代码页和可以为该数据类型表示的相应字符。
以上是针对 MsSql 的,但它适用于大多数主流数据库。
如果你使用的是linqToSql,那么linq就变成了查询,在数据库中执行,所以实际的比较发生在SQL端。
所以你需要在你的表上修复排序规则。
【讨论】:
【参考方案2】:默认情况下,字符串比较在 C# 中区分大小写(除非您使用特定的字符串比较机制)。
看你怎么说:
但在数据库中的用户名是
假设您正在使用某种 LinQ to SQL,那么罪魁祸首很可能是您的列的设置方式。默认情况下,某些 DB 引擎以不区分大小写的方式匹配字符串,这里似乎也是如此。
【讨论】:
【参考方案3】:你应该使用String.Equals
//verify the user.
var UserDetails =
(from user in con.ios_Users
where (string.Equals(user.LOGIN, LogReq.userName, StringComparison.InvariantCultureIgnoreCase) && string.Equals(user.PASSWORD, LogReq.password , StringComparison.InvariantCultureIgnoreCase) && user.ACTIVE != 0)
select new
user.ID,
user.TYPEDESCR,
user.USERNAME
).ToList();
【讨论】:
这正是 OP 不想要的,不是吗? 它给出错误:( 为调用方法'Boolean Equals(System.String, System.String, System.StringComparison)提供的参数数量不正确 我刚刚更新了我的答案,请看@npinti 你仍然忽略了这个案例,这不是 OP 想要的 这能回答你的问题吗?如果您需要任何帮助,请告诉我@Anuradha Dawkore以上是关于如何匹配区分大小写的用户名和密码的主要内容,如果未能解决你的问题,请参考以下文章