使用不在html5中工作的存储过程登录

时间:2014-08-13 04:50:06

标签: sql asp.net html5 stored-procedures

以下是我为登录编写的代码,我想在输入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不匹配。用户表顺序的屏幕截图:

User table

    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();
    }

1 个答案:

答案 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语句中重定向 首先获取用户,然后重定向。