繁体   English   中英

如何通过存储过程验证用户登录

[英]How to validate user login through stored procedure

我正在尝试从我的代码后台调用该方法,该代码链接到我的业务访问层并从我的数据访问层获取该方法。 单击登录后,我想检查数据表是否返回一行匹配值,如果是,则将用户重定向到我的产品页面。 问题是,我的方法没有返回任何内容,因此在单击按钮时没有任何反应。 谁能指出我做错了什么?

//code behind
private void Login()
{
   //this connects to BA layer
   string username = Convert.ToString(txtUser.Text);
   string password = Convert.ToString(txtPassword.Text);
   new BALlogin().ValidateUser(username, password);
}

//method in my business access layer
class BALlogin
{
   public void ValidateUser(string username, string password) //wasvoid
   {
      new GetUser().GetUserpassword(username, password);            
   }
}

//code in data access layer
public void GetUserpassword(string username, string password)
{
   DataSet myDataSet = new DataSet();
   SqlCommand cmdvaliduser = new SqlCommand();
   cmdvaliduser.CommandText = "sp_userlogin";
   cmdvaliduser.CommandType = CommandType.StoredProcedure;
   cmdvaliduser.Connection = TROPSConnection.GetConnection();
   cmdvaliduser.Parameters.AddWithValue("@userid", username);
   cmdvaliduser.Parameters.AddWithValue("@password", password);
   cmdvaliduser.Connection.Open();
   SqlDataAdapter da = new SqlDataAdapter();
   DataTable dt = new DataTable();
   da.Fill(dt);

   cmdvaliduser.ExecuteNonQuery();
   cmdvaliduser.Connection.Close();
}

protected void loginButton_Click(object sender, EventArgs e)
{
   try
   {
      Login();

      DataTable dt = new DataTable();
      if (dt.Rows.Count > 0)
      {
         Response.Redirect("Products.spx");
      }
   }
   catch
   {
      Console.WriteLine("{0} Exception caught.", e);
   }
}

您没有正确设置数据适配器。
您正在基于空的DataAdapter填充数据表dt
你应该用

da = new SqlDataAdapter(cmdValidUser);


但是我同意Joel的观点,您应该将密码作为哈希值存储在数据库中。
然后,将您的Getuserpassword()重新编写为checkUserPassword(),并使其返回一个布尔值(无论用户/密码有效还是无效)。
设置存储过程,以便您传递用户名和密码哈希,在数据库中进行检查,然后从存储过程中将TRUE / false作为OUTPUT变量返回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM