簡體   English   中英

C# 登錄 Web 表格

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM