如何使用linq验证用户名/密码?

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)

Chr*_*lor 9

您不应指定用户名是否正确或指定密码不正确,"无效的用户名或密码"应该足够.对大多数系统来说都很常见

这将使您检查状态,如果用户名/密码组合正确,则您返回了用户记录,您可以从中检查状态.

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)