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