我需要将用户名字段和密码字段与数据库中的字段进行比较,我的代码确实有效,但问题是比较不区分大小写。下面是我的代码的一部分,我知道我必须丢失一些愚蠢的东西。任何帮助将不胜感激,谢谢
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 View("Login", UserModel);
}
else
{
Session["UserId"] = UserDetail.UserId;
return RedirectToAction("Index", "Home");
}
答案 0 :(得分:2)
EF to SQL Server将执行字符串比较不区分大小写。要像您描述的那样执行区分大小写的检查:
var users = var UserDetail = db.UserTbls.Where(x => x.UserName == UserModel.UserName).ToList();
var matchingUser = users.SingleOrDefault(x => x.Password == password);
.ToList()将意味着将对Object评估下一个表达式,返回具有该名称的所有用户记录。如果用户名是唯一的,那么这应该是SingleOrDefault()。从那里开始,密码上的==操作默认区分大小写。
然而,如Stephen所述,密码应该始终用盐进行哈希并存储,比较HASHES,而不是纯文本密码。
我建议阅读SHA-1哈希值。
答案 1 :(得分:0)
string.Compare
方法有和重载,您可以使用它来比较用户名和密码。
斯蒂芬提到,你当然需要努力实施适当的安全措施。
答案 2 :(得分:0)
如果要比较忽略大小写的用户名,可以选择以下选项:
x.UserName.Equals(UserModel.UserName, StringComparison.OrdinalIgnoreCase)
如果要比较区分大小写的用户名,可以选择以下选项:
x.UserName.Equals(UserModel.UserName, StringComparison.Ordinal)
更新
对于那些看到我的回答的人来说,我想指出我已经投票的Steve Py's回答。并且,here是一个很好的相关解释。
(我想我也可以在这里留下我的答案,以防人们看到比较字符串的不同方法仍然有用)