繁体   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