bsh*_*52s 2 c# linq authentication
我还在学习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();
Run Code Online (Sandbox Code Playgroud)
这有效但现在我需要记录登录失败的原因.如果用户名无效,我会记录一件事.如果密码错误,我会记录另一个.或者,如果用户处于非活动状态(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
}
Run Code Online (Sandbox Code Playgroud)
您不应指定用户名是否正确或指定密码不正确,"无效的用户名或密码"应该足够.对大多数系统来说都很常见
这将使您检查状态,如果用户名/密码组合正确,则您返回了用户记录,您可以从中检查状态.
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
}
Run Code Online (Sandbox Code Playgroud)
如果必须指出无效用户名与无效密码之间的区别,则可以执行以下操作.
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
}
Run Code Online (Sandbox Code Playgroud)