用户凭据验证函数始终判定为true问题及相关代码求助
咱们直接拆解问题核心——你的验证逻辑犯了一个典型的逻辑错误,导致不管用户输入的凭据是否属于同一个用户,都可能通过验证。
问题根源分析
你当前的代码是分开查询数据库中是否存在匹配输入邮箱的用户,以及是否存在匹配输入密码的用户,这两个查询完全独立:
- 只要数据库里有任何一个用户的邮箱和你输入的
emai(注意这里参数名拼错了,应该是email)匹配,email变量就不为null - 只要数据库里有任何一个用户的密码和你输入的
pass匹配,password变量就不为null
举个极端例子:数据库里有用户A(邮箱a@test.com,密码123)和用户B(邮箱b@test.com,密码456),当你输入邮箱a@test.com、密码456时,email会查到用户A(不为null),password会查到用户B(不为null),这时候你的条件(email == null) || (password == null)就不成立,直接跳转到About页面——这显然不是正确的凭据验证逻辑。
修复方案
1. 修正核心验证逻辑
正确的做法是查询是否存在一个同时匹配输入邮箱和密码的用户,确保是同一个用户的凭据正确。修正后的代码如下:
public ActionResult Authorize(string email, string pass) { using (WorkFlowContext db = new WorkFlowContext()) { // 关键:同时匹配邮箱和密码,定位到唯一用户 var validUser = db.User.FirstOrDefault(x => x.Email_Address == email && x.Password == pass); if (validUser == null) { ViewBag.Message = "The email or password is incorrect."; return View("Index"); } else { return RedirectToAction("About", "Home"); } } }
2. 修复参数拼写错误
你原来的参数名是emai(少了一个l),虽然代码里后续重新赋值了var email = ...,但这种拼写错误很容易引发其他隐性问题,建议直接把参数名改成email,和数据库字段命名保持一致。
3. 重要安全提醒:禁止存储明文密码!
必须强调:直接在数据库中存储明文密码是严重的安全漏洞,完全不符合行业规范。正确的做法是存储密码的哈希值,验证时对用户输入的密码进行相同的哈希运算,再和数据库中的哈希值比对。比如使用ASP.NET自带的PasswordHasher类:
// 注册用户时存储哈希密码 var hashedPassword = new PasswordHasher().HashPassword(pass); // 将hashedPassword存入数据库的Password字段 // 验证凭据时 var user = db.User.FirstOrDefault(x => x.Email_Address == email); if (user == null) { ViewBag.Message = "The email or password is incorrect."; return View("Index"); } var verificationResult = new PasswordHasher().VerifyHashedPassword(user.Password, pass); if (verificationResult == PasswordVerificationResult.Failed) { ViewBag.Message = "The email or password is incorrect."; return View("Index"); } // 验证通过,跳转页面 return RedirectToAction("About", "Home");
总结
你的核心问题是拆分了邮箱和密码的查询逻辑,导致跨用户的匹配也能通过验证,只要合并查询条件、确保同时匹配同一用户的邮箱和密码,就能解决“始终返回True”的问题。同时别忘了修复拼写错误,以及升级密码存储的安全方式。
内容的提问来源于stack exchange,提问作者JOHAN FERNANDEZ DECENA

