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

标签 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();

这行得通,但现在我需要记录登录失败的原因。如果用户名无效,我会记录一件事。如果密码错误,我会重新登录。或者,如果用户处于非事件状态(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/

相关文章:

c# - 禁用和启用后 WPF 文本框焦点 "sticking"

c# - 在 C# 中向后计算增值税总是返回 0

linq - 使用 C# .Net 4.0 LINQ 嵌入逗号的 CSV

ios - Beta 测试、Facebook 登录、Parse。某些用户的 Facebook 信息未保存到 Parse。 swift

c# - 为什么对 Azure Document DB 的第一个请求比后续请求慢得多?

c# - 如何在 asp.net C# 中验证按钮单击时的表达式

java - 如何从 Java 类到 GlassFish 创建新用户?

php - 自动聚焦于输入表单

c# - Linq 查询 XML 以选择子节点的多个元素

c# - 从DataTable中删除具有相同列值的行并添加相应的值