[英]C# Login Web Form
我無法弄清楚我在這里做錯了什么。 我正在嘗試為我的應用程序設置一個基本登錄表單,該表單使用我的 SQL 數據庫進行身份驗證。 這是代碼:
public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
lblError.Visible = false;
}
protected void btnLogin_Click(object sender, EventArgs e)
{
using (SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString))
{
myConnection.Open();
try
{
string userID = txtUser.Text;
string passID = txtPassword.Text;
SqlDataReader reader = null;
SqlCommand cmd = new SqlCommand("SELECT UserName, Password From Users WHERE UserName = @user AND Password = @pass", myConnection);
SqlParameter userParam = cmd.Parameters.Add("@user", SqlDbType.NVarChar, 50);
SqlParameter passParam = cmd.Parameters.Add("@pass", SqlDbType.NVarChar, 50);
userParam.Value = userID;
passParam.Value = passID;
reader = cmd.ExecuteReader();
while (reader.Read())
{
if (reader["UserName"].ToString() == userID && reader["Password"].ToString() == passID)
{
Response.Redirect("TaskMonitor.aspx");
}
else
{
lblError.Visible = true;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
myConnection.Close();
}
}
}
無論我輸入正確的用戶名和密碼還是不正確,它都不會做任何事情。
因為當用戶名或密碼無效時,不會返回任何行,並且您在while
中的代碼不會被執行。
您可以將其更改為:
SqlCommand cmd = new SqlCommand("SELECT COUNT(*) From Users WHERE UserName = @user AND Password = @pass", myConnection);
/* ... init parameters etc ... */
if((int)cmd.ExecuteScalar() == 0)
{
// Access Denied
}
else
{
// Access Granted
}
此外,您的頁面加載隱藏了錯誤 label,可能需要將其更改為:
if (!IsPostBack) lblError.Visible = false;
您還可以使用 ASP.NET 的內置表單身份驗證來處理 session:
FormsAuthentication.RedirectFromLoginPage(userID, false);
他提到了這兩種情況
我的建議是:使用更簡單的代碼:
myConnection.Open();
SqlCommand myCommand = new SqlCommand("Select * from myDT", myConnection);
myCommand.Parameters.AddWithValue("user", user.Text);
SqlDataReader reader = myCommand.ExecuteReader();
if(reader.HasRows) // i remember there is such a thing !
{
}
// myCommand.Parameters.Add("@user", user.Text); is false as i remember
當前,您捕獲了引發的每個錯誤並將其寫入控制台,但正如您之前所說,您正在開發 web 應用程序,因此沒有控制台。 因此,首先將 Console.writeLine 語句替換為 Response.WriteLine,或者刪除完整的 try 和 catch 語句。
其次,如果查詢沒有返回任何結果,則跳過完整的 if else 語句。 檢查閱讀器是否有任何結果更容易:如果有,則比您觸發重定向,否則,顯示 label
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.