MVC登录用户名密码与数据库对比不区分大小写问题求助
问题:登录验证不区分大小写的问题
我现在的代码能正常运行,但登录时用户名和密码的对比不区分大小写,比如输入"admin"和"Admin"都能通过,这不是我想要的效果。以下是我的部分代码,肯定漏了简单设置,求帮忙,谢谢!
var UserDetail = db.UserTbls.Where(x => x.UserName == UserModel.UserName && x.Password == UserModel.Password).FirstOrDefault(); if (UserDetail == null) { UserModel.loginErrorMessage = "Wrong Username or Password"; return ... }
解决方案
哈哈,这问题我之前也踩过坑!主要是默认的字符串比较行为取决于数据库的排序规则,大部分数据库默认是不区分大小写的,所以咱们得手动干预一下,给你几个简单的解决思路:
1. 在LINQ查询里显式指定区分大小写的比较
如果你用的是EF Core,直接用StringComparison.Ordinal来强制区分大小写就行,这样查询的时候就会严格匹配大小写了:
var UserDetail = db.UserTbls .Where(x => x.UserName.Equals(UserModel.UserName, StringComparison.Ordinal) && x.Password.Equals(UserModel.Password, StringComparison.Ordinal)) .FirstOrDefault();
要是用的是老版EF(EF6及以前),可能需要用SqlFunctions.StringConvert或者直接写SQL片段,不过EF Core的写法最省心。
2. 修改数据库字段的排序规则
从根源上解决的话,可以把UserName和Password字段的排序规则改成区分大小写的,比如SQL Server里选Latin1_General_CS_AS(CS就是Case Sensitive的意思)。不过改这个之前要确认现有数据会不会受影响,比如之前存的是"Admin",现在输入"admin"就查不到了,得提前做好数据校验。
重要提醒:别存明文密码!
哦对了,必须提一句,你现在直接对比明文密码是非常危险的操作!正规做法是只存储密码的哈希值,登录时把用户输入的密码做同样的哈希处理,再和数据库里的哈希值对比。比如用BCrypt或者ASP.NET自带的哈希工具:
注册时哈希密码:
var hashedPassword = BCrypt.Net.BCrypt.HashPassword(UserModel.Password); // 把hashedPassword存入数据库的Password字段
登录时验证:
var user = db.UserTbls .Where(x => x.UserName.Equals(UserModel.UserName, StringComparison.Ordinal)) .FirstOrDefault(); if (user == null || !BCrypt.Net.BCrypt.Verify(UserModel.Password, user.Password)) { UserModel.loginErrorMessage = "Wrong Username or Password"; return ... }
这样不仅解决了大小写的问题,还能大幅提升账号安全性,毕竟就算数据库被拖库,黑客也拿不到真实密码。
内容的提问来源于stack exchange,提问作者O.A.K
相关产品推荐
相关产品推荐

