MVC登录密码比较区分大小写

时间:2018-05-04 04:20:57

标签: asp.net asp.net-mvc entity-framework

我需要将用户名字段和密码字段与数据库中的字段进行比较,我的代码确实有效,但问题是比较不区分大小写。下面是我的代码的一部分,我知道我必须丢失一些愚蠢的东西。任何帮助将不胜感激,谢谢

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");
}

3 个答案:

答案 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是一个很好的相关解释。

(我想我也可以在这里留下我的答案,以防人们看到比较字符串的不同方法仍然有用)