我仍在学习 LINQ。我可以做一些简单的查询,但这个有点不同。我有以下对用户进行身份验证的查询。
User user = (from u in db.Users
where u.Username.Equals(username) &&
u.Password.Equals(UserSecurity.GetPasswordHash(username, password)) &&
u.Status == true
select u).FirstOrDefault();
这行得通,但现在我需要记录登录失败的原因。如果用户名无效,我会记录一件事。如果密码错误,我会重新登录。或者,如果用户处于非事件状态(status = false),那么我将记录另一个。我意识到我可以将其分成 3 个单独的查询来找出失败的原因,但我想知道在一个查询中是否会更有效率。如果是这样,如何?这是我的(未经测试的)3 查询方法。
User user2 = null;
var users1 = db.Users.Where(i => i.Username.Equals(username));
if (users1 != null)
{
var users2 = users1.Where(i => i.Password.Equals(UserSecurity.GetPasswordHash(username, password)));
if (users2 != null)
{
var users3 = users2.Where(i => i.Status);
if (users3 != null)
{
user2 = users3.FirstOrDefault();
}
else
{
// User inactive
}
}
else
{
// Password invalid.
}
}
else
{
// Username invalid
}
最佳答案
您不应指定用户名是否正确或指定密码不正确,“无效的用户名或密码”就足够了。并且对大多数系统都是通用的。
这让您可以检查状态,如果用户名/密码组合正确,那么您会返回用户记录,您可以从中检查状态。
User user = (from u in db.Users
where u.Username.Equals(username) &&
u.Password.Equals(UserSecurity.GetPasswordHash(username, password))
select u).FirstOrDefault();
if (user == null)
{
// Invalid user name or password
}
else if (user.Status != true)
{
// User inactive
}
else
{
// Success
}
如果您必须指出无效用户名与无效密码之间的区别,您可以执行以下操作。
User user = (from u in db.Users
where u.Username.Equals(username)
select u).FirstOrDefault();
if (user == null)
{
// Invalid user name
}
else if (!user.password.Equals(...))
{
// Invalid password
}
else if (user.Status != true)
{
// User inactive
}
else
{
// Success
}
关于c# - 如何使用 linq 验证用户名/密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3664075/