以下是我为登录编写的代码,我想在输入userName和Password时,它可以确认数据库并确保正确,然后转到home.aspx。
我的存储过程是:
CREATE DEFINER=`root`@`localhost` PROCEDURE `login`(in userName varchar(50), in password varchar(50))
BEGIN
select * from `users`
where `users`.`userName`=UserName
and `users`.`password`=Password;
END
我的数据库是MySQL,我不知道哪里出错了,系统与数据库userName和Password不匹配。用户表顺序的屏幕截图:
protected void btnLogin_Click(object sender, EventArgs e)
{
string UserName = txtUserName.ToString();
string Password = txtPassword.ToString();
SqlConnection conn = new SqlConnection(connstr);
SqlCommand cmd = new SqlCommand("login", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("UserName",Server.HtmlEncode(txtUserName.Value));
cmd.Parameters.AddWithValue("Password", Server.HtmlEncode(txtPassword.Value));
SqlDataReader rdr;
conn.Open();
rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
rdr.Read();
if (rdr.HasRows)
{
Session["UserName"] = rdr.GetString(1);
Session["Password"] = rdr.GetString(2);
Page.Response.Redirect("home.aspx");
}
else
{
lblMsg.Text = "Please check your user name or password";
}
rdr.Close();
cmd.Dispose();
conn.Dispose();
}
答案 0 :(得分:0)
在数据库中查找名称/密码时,您不应该Server.HtmlEncode
。
你应该真正分开数据和它的演示。
HTML-Encoding不属于存储在数据库中的文本
如果您需要存储国际名称,请将字段的编码设置为UTF8。
此外,请不要使用会话,尤其不要用于用户管理。
您将无法同时使用2个用户登录(如果您在会话中存储页面数据,甚至不能为同一用户存储两个选项卡),并且会话将在20分钟后过期,然后您将获得NULL-到处引用例外。
我目前必须维护(=每当我有机会重写一个部分)这样的系统。
这是一场噩梦。此外,还有已经形成身份验证的Cookie,可以更好地完成工作。
此外,您应该在连接和命令周围使用using子句
如果您不这样做,则每次例外都不会关闭连接,并且您的连接池迟早会超过其最大容量==>错误
此外,在执行conn.Open()之前,应检查连接是否已打开(关闭时相同)。
请不要在datareader的GetString或GetValue方法中使用索引。始终使用字段的名称。
dr.GetValue(dr.GetOrdinal("COLUMN_Name"));
如果有人添加了一个不在最后的字段,那将会破坏您的代码 当绝对没有必要时,不要以这种方式微观优化性能(使用索引几乎从不)。
正确的阅读方式是
if (dReader.HasRows)
{
while (dReader.Read())
{
// GetValue comes here
}
}
您可能还想在sql语句中添加LIMIT 1,以防万一您没有在用户名上添加唯一索引。
你可以建立的东西:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace SimpleLoginSite
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
} // End Sub Page_Load
protected void btnLogin_Click(object sender, EventArgs e)
{
string connstr = GetConnectionString();
using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(connstr))
{
string UserName = txtUserName.ToString();
string Password = txtPassword.ToString();
using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("login", conn))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("UserName", Server.HtmlEncode(this.txtUserName.Text));
cmd.Parameters.AddWithValue("Password", Server.HtmlEncode(this.txtPassword.Text));
if (conn.State != System.Data.ConnectionState.Open)
conn.Open();
using (System.Data.SqlClient.SqlDataReader rdr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection))
{
if (rdr.HasRows)
{
while (rdr.Read())
{
Session["UserName"] = rdr.GetString(rdr.GetOrdinal("username"));
Session["Password"] = rdr.GetString(rdr.GetOrdinal("password"));
Page.Response.Redirect("home.aspx");
} // Whend
}
else
{
lblMsg.Text = "Please check your user name or password";
lblMsg.Visible = true;
}
if (!rdr.IsClosed)
rdr.Close();
} // End Using SqlDataReader rdr
} // End Using SqlCommand cmd
if (conn.State != System.Data.ConnectionState.Closed)
conn.Close();
} // End Using SqlConnection conn
} // End Sub btnLogin_Click
public static string GetConnectionString()
{
System.Data.SqlClient.SqlConnectionStringBuilder csb = new System.Data.SqlClient.SqlConnectionStringBuilder();
csb.DataSource = "localhost";
csb.InitialCatalog = "TestDB";
csb.IntegratedSecurity = true;
if (!csb.IntegratedSecurity)
{
csb.UserID = "ApertureWebServicesDE";
csb.Password = "TopSecret";
}
return csb.ConnectionString;
} // End Function GetConnectionString
} // End partial class Default : System.Web.UI.Page
} // End Namespace SimpleLoginSite
和aspx页面:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SimpleLoginSite.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style type="text/css" media="all">
label
{
display:block;
float: left;
width: 100px;
text-align: right;
padding-right: 0.25cm;
}
input
{
width: 300px;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<fieldset>
<legend>Login</legend>
<label for="txtUserName">Username:</label>
<asp:TextBox name="name" ID="txtUserName" placeholder="e.g. john.doe@example.com" runat="server" />
<br />
<label for="txtPassword">Password:</label>
<asp:TextBox name="txtPassword" ID="txtPassword" placeholder="e.g. Open Sesame" TextMode="Password" runat="server" />
<br /><br />
<asp:Button ID="btnLogin" Text="Login" runat="server" OnClick="btnLogin_Click" />
</fieldset>
</div>
<asp:Label ID="lblMsg" Text="" runat="server" ></asp:Label>
</form>
</body>
</html>
这是存储的程序
CREATE PROCEDURE [dbo].[login]
@userName varchar(50)
,@password varchar(50)
AS
BEGIN
-- SET @userName = 'MyUser';
-- SET @password = 'MyPassword';
SELECT *
FROM users
WHERE users.username = @userName
AND users.password = @password
;
END
GO
PS:
看起来您的存储过程是MySQL,但您正在使用System.Data.SqlClient
如果使用MySQL,则需要使用MySql.Data.MySqlClient
此外,您不应该在SQL语句中重定向
首先获取用户,然后重定向。