簡體   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