大写和小写都接受相同的密码

时间:2016-12-12 09:51:23

标签: c# asp.net-mvc

我现在面临一个奇怪的问题。我在ASP.NET MVC中有一个登录页面,它接受用户的用户名和密码。 当用户单击“登录”按钮时,表单将使用输入的数据提交回控制器。

然后我使用下面的代码来检查它是否是有效的登录信息:

var isValidLogin = (from user in dbEntities.usermasters
                     where (user.userName.Equals(login.username) && user.password.Equals(login.password))
                     select user).Any();
对于这两种情况,

isValidLogin都会返回true。即如果密码为pwd且用户进入PWD,则返回true。 希望得到一些有价值的建议。

1 个答案:

答案 0 :(得分:3)

我认为SQL Server的默认排序规则不区分大小写。您可以在服务器,表或列级别设置排序规则。

检查服务器协作:

SELECT SERVERPROPERTY('COLLATION')

就我而言,它是:Latin1_General_CI_AS。此CI代表不区分大小写。

您可能会对string.Equals不区分大小写感到困惑,但它实际上已转换为LINQ to Entities中的查询。

如果需要,您可以将密码列的排序规则更改为区分大小写。

<强> PS

实际上不建议以明文存储密码。如果你是数据库,或者它的备份受到损害,你就注定要失败。推荐将它们存储为盐渍哈希。每次用户登录时,都会将hash + salt应用于密码,并将其与存储在数据库中的密码进行比较。哈希不可逆转。

此外,如果您使用哈希值,它将区分大小写为奖励:)