-1

我正在使用 ASP.NET 成员资格,因为这不是具有这种身份验证的典型网站。我有管理员使用 Uname 和密码(加密)分配的表。

单击登录按钮时,我有一个登录页面,我需要在我的数据库表中搜索用户。

public void getuserinfo()
{
    String var = System.Configuration.ConfigurationManager
        .ConnectionStrings["KKSTechConnectionString"].ConnectionString;

    SqlConnection conn = new SqlConnection(var);
    SqlCommand myCmd = new SqlCommand("SELECT Username, Pass FROM Users", conn);
    conn.Open();

    if(TextBox1== Username) && (TextBox2== Password) <- I am not able to get this right :( 
    {
        //How do I get his info?? 
    }
} 

*Database table for dbo.users:*

Uname(PK) | Pass | EmpID (FK)

我想先解密密码,然后将其与 TextBoxPassword 进行比较。

请帮忙。

4

2 回答 2

2

另一种方法是对在用户屏幕上输入的密码进行哈希处理,并将其与存储在数据库中的哈希密码进行比较。

现在,像这样使用你的函数。

public void ValidateUser()
{
    var connectionString = System.Configuration.ConfigurationManager
        .ConnectionStrings["KKSTechConnectionString"].ConnectionString;
    var userName = txtUserName.Text;
    var hashedPassword = Helper.ComputeHash(txtPassword.Text, "SHA512", null);
    // this query should be parameterised when used in production to avoid SQL injection attacks
    var query = String.Format("SELECT Username, Pass FROM Users WHERE Username='{0}' AND Pass='{1}'",
                    userName,
                    hashedPassword);

    using(var connection = new SqlConnection( connectionString ))
    using(var command = new SqlCommand(query, connection ))
    {
        conn.Open();
        SqlDataReader reader=command.ExecuteReader();
        if(reader.Read())
        {

        }
        reader.Close();
    }
}
于 2012-08-17T04:51:42.180 回答
0

在我们得到解决方案之前有几个问题:

  1. 您如何将用户名和密码从客户端发送到服务器端?是纯文本吗?
  2. 加密发生在哪里?
  3. 您是否编写了加密代码或使用了可用的标准之一?

在您的代码中,我可以注意到以下问题:

  1. 尽管您从未在数据库上执行过查询,但您已经创建了连接对象和命令对象。
  2. 您正在使用的查询返回整个用户表,这绝对不是必需的。您已经拥有用户名和密码的用户输入,因此只需查找它们是否正确。
  3. 使您的查询参数化并将输入发送到数据库。在那里,检查用户名和密码是否匹配。如果他们这样做,请发回用户详细信息(我想您将需要在应用程序的某个地方),否则,抛出异常或返回 null。

在匹配用户名和密码之前,请务必注意加密/解密。

于 2012-08-17T04:41:40.357 回答