You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:56:04