ASP.net 中的字符串比较 (C#)

本文关键字:比较 字符串 net ASP | 更新日期: 2023-09-27 18:34:41

我正在编写与 ASP.net Web服务连接的Android应用程序(C#,3.5(

android应用程序将用户的"登录"信息发送到网络服务,以验证用户是否已注册。

以下是接收请求的[WebMethod]

[WebMethod]
public SigninPerson signin(SigninPerson SIPerson)
{
    SigninPerson Temp = new SigninPerson(0, "", "", "", "");
    LinqToSQLDataContext DataBase = new LinqToSQLDataContext();
    var Person = (from a in DataBase.Persons
                  where a.Email == SIPerson.E_Mail &&
                      a.Password.Equals(SIPerson.Password,StringComparison.Ordinal)
                  select new SigninPerson
                  {
                      Person_Id = a.Person_Id,
                      F_Name = a.First_Name,
                      L_Name = a.Last_Name,
                      E_Mail = a.Email,
                      Password = a.Password
                  });
    if (Person.Any() == true)
    {
        Temp = Person.FirstOrDefault();
    }
    return Temp;
}

SigninPerson是一个保存用户信息(如名字,姓氏,密码...(的类。

问题出在密码比较中。 它接受了所有案例

例如:

如果存储在数据库中的人的密码是"ABD",并且用户输入了"abd"作为密码,应用程序接受了它!(不区分大小写!!(

如何解决这个问题?

ASP.net 中的字符串比较 (C#)

将 LINQ 更改为以下内容:

var Person = (from a in DataBase.Persons
              where a.Email == SIPerson.E_Mail
              select new SigninPerson
              {
                  Person_Id = a.Person_Id,
                  F_Name = a.First_Name,
                  L_Name = a.Last_Name,
                  E_Mail = a.Email,
                  Password = a.Password
              })
              .ToList()
              .Where(sp => sp.Password.Equals(SIPerson.Password));

这将强制字符串比较通过 .NET 框架在客户端进行,而不是在 SQL Server 上的服务器端进行。


正如Andleer所说,还有另一种方法可能更有效。现在,在实践中,你不太可能看到这个,但这是一个好习惯。您实际上可以这样做:

var Person = (from a in DataBase.Persons
              where a.Email == SIPerson.E_Mail
              select new SigninPerson
              {
                  Person_Id = a.Person_Id,
                  F_Name = a.First_Name,
                  L_Name = a.Last_Name,
                  E_Mail = a.Email,
                  Password = a.Password
              })
              .Take(1)
              .AsEnumerable()
              .Where(sp => sp.Password.Equals(SIPerson.Password));

应该确保它永远不会返回所有行,而只返回 1。同样,在这个实际案例中,它可能不是那么相关,因为几乎肯定只有一个 - 但这是一个很好的想法,值得添加,值得注意。

问题是 SQL 不会执行区分大小写的匹配,除非已配置为这样做,有关详细信息,请参阅此处。

或者,您可以在获得匹配项后通过代码进行检查:

而不是 if (Person.Any()) ,请使用以下命令:

var first = Person.FirstOrDefault();
if (first != null && first.Password == SIPerson.Password)
{
    Temp = first;
}