如何通过存储过程验证用户登录
本文关键字:用户 登录 验证 存储过程 何通过 | 更新日期: 2023-09-27 18:14:48
我试图从我的代码后面调用该方法,该方法链接到我的业务访问层并从我的数据访问层获取该方法。在单击登录时,我想检查数据表是否返回一行匹配的值,如果是,则将用户重定向到我的产品页面。问题是,我的方法没有返回任何东西所以点击按钮时什么都没有发生。谁能指出我做错了什么吗?
//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变量。