登录身份验证逻辑在 C#.NET 中不起作用
本文关键字:NET 不起作用 身份验证 登录 | 更新日期: 2023-09-27 18:36:39
我创建了user_info表,其中有 2 个用户名和密码。当我执行以下代码时,即使我输入正确的用户名和密码,它也总是进入"else"条件。
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
string v = System.Configuration.ConfigurationManager.ConnectionStrings["harish"].ConnectionString;
con = new OracleConnection(v);
con.Open();
cmd = new OracleCommand("select * from user_info where username='" + Login1.UserName.Trim() + "' and password='" + Login1.Password + "'", con);
dr = cmd.ExecuteReader();
dr.Read();
if (dr.HasRows)
{
Response.Redirect("Default2.aspx");
}
else
{
Response.Redirect("Default.aspx");
}
con.Close();
dr.Close();
}
它进入其他,因为 dr 没有行。 要找出原因,请设置断点
dr = cmd.ExecuteReader();
然后,使用带有参数的实际 SQL select 命令,并将其作为针对数据库的 SQL 语句运行,以查看它是否返回行。 我的怀疑是,无论您认为输入 Login1.用户名和/或登录 1.Password 是什么,都没有传递任何东西,但在不知道 Login1 如何填充的情况下很难说。
顺便说一句,如果这些是网页上的文本框,那么您需要使用Login1.Username.Text和Login1.Password.Text来获取文本框中的实际字符串。
首先,您至少应该对密码进行哈希处理。 此外,最佳做法是不要将您的连接留在班级级别。 使用它们时,应创建、打开和关闭它们。 与命令、阅读器等相同...这可以通过使用块非常容易地完成。
接下来,确保您在使用 Login1.UserName 和 Login1.Password 时访问的是实际的字符串值而不是控件。 如果您使用的是控件,则需要使用 Login1.UserName.Text.Trim() 和 Login1.Password.Text.Trim()。 可以通过将生成的查询存储到本地字符串值中并查看实际生成的内容来确保这一点。
不要将 DataReader 用于您正在做的事情。 请改用 ExecuteScalar 方法:
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
string v = System.Configuration.ConfigurationManager.ConnectionStrings["harish"].ConnectionString;
con = new OracleConnection(v);
con.Open();
cmd = new OracleCommand("select * from user_info where username='" + Login1.UserName.Trim() + "' and password='" + Login1.Password + "'", con);
int count = Convert.ToInt32(cmd.ExecuteScalar());
if (count > 0)
{
Response.Redirect("Default2.aspx");
}
else
{
Response.Redirect("Default.aspx");
}
con.Close();
}
完成此设置后,在 if(计数> 0)行上放置一个断点。 检查存储在本地 var 中的查询并检查计数。 这应该可以满足你所需要的一切。