使用一个数据库表进行基本登录

本文关键字:登录 数据库 一个 | 更新日期: 2023-09-27 18:12:08

我目前正在创建一个CMS,并有一个用户可以创建,编辑和删除用户的部分。信息是从数据库生成的,我在其中创建了一个包含User_ID、User_Name和User_Password的表。这意味着我不想使用自动生成的数据库表VS给你的登录。

有了这个,我正试图开发一个真正基本的登录,但我很难理解这个过程。

这是我的网。整个应用程序的配置:
<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="websiteContent" connectionString="uid=AAA;pwd=AAA;Initial Catalog=AAA;Data Source=.'SQLEXPRESS"/>
  </connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
    <authentication mode="Forms">
      <forms loginUrl="~/tools/default.aspx" timeout="2880"/>
    </authentication>
  </system.web>
</configuration>

网络。登录配置:

<?xml version="1.0"?>
<configuration>
  <location path="default.aspx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>
  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
</configuration>

这是我在前端的登录:

            <asp:Login ID="Login1" runat="server" CssClass="loginSec" TextLayout="TextOnTop"
                TitleText="" OnAuthenticate="Login1_Authenticate">
                <LabelStyle CssClass="lblLogin" />
                <TextBoxStyle CssClass="txtLogin" />
            </asp:Login>

从后端登录:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    string userName = Login1.UserName;
    string passWord = Login1.Password;
    bool rememberUserName = Login1.RememberMeSet;
    using (SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["websiteContent"].ConnectionString))
    {
        sqlCon.Open();
        string SQL = "SELECT CMS_Username, CMS_Password FROM CMS_Users WHERE CMS_Username ='" + userName + "' AND CMS_Password ='" + passWord + "'";
        using (SqlCommand sqlComm = new SqlCommand(SQL, sqlCon))
        {
            sqlComm.ExecuteScalar();
            if (sqlComm.ExecuteScalar() != null)
            {
                Response.Redirect("cms.aspx");
            }
            else
            {
                Session["UserAuthentication"] = "";
            }
        }
        sqlCon.Close();
    }
}
到目前为止,我所做的已经阻止了对页面cms的访问。Aspx,但登录永远不会重定向到该页面。

任何见解将不胜感激!!

使用一个数据库表进行基本登录

我已经按照docs的要求添加了Authenticated的设置

自定义身份验证方案应将Authenticated属性设置为为True,表示用户已通过认证。

更多的研究使我认为有必要在你的代码中添加这一行

FormsAuthentication.SetAuthCookie(Login1.UserName, true);

我也会尝试改变你的代码,以这样的方式,ExecuteScalar返回用户的用户名和密码的计数。这样,ExecuteScalar将永远不会返回NULL,但如果不存在用户,则返回0,如果存在用户,则返回1(我假设您没有具有相同用户和密码的两条记录)

using (SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["websiteContent"].ConnectionString))
{
    sqlCon.Open();
    string SQL = "SELECT COUNT(*) As LoginFound FROM CMS_Users " + 
                 "WHERE CMS_Username =@usr AND CMS_Password = @pwd";
    using (SqlCommand sqlComm = new SqlCommand(SQL, sqlCon))
    {
        sqlComm.Parameters.AddWithValue("@usr", userName);
        sqlComm.Parameters.AddWithValue("@pwd", password);
        int result = (int)sqlComm.ExecuteScalar();
        if (result > 0)
        {
            // In case of success you need to communicate this 
            e.Authenticated = Authenticated;
            FormsAuthentication.SetAuthCookie(Login1.UserName, true);
            Response.Redirect("~/tools/cms.aspx");
        }
        else
        {
            Session["UserAuthentication"] = "";
        }
    }
}

另外,我已经从sql命令中删除了字符串连接。这是将字符串文本传递给数据库的正确方法。特别是当值来自用户输入时。

(参见Sql注入)

编辑当然是cmd。Aspx页面应该检查用户是否已通过身份验证,否则用户可以直接键入cms的url。Aspx页面绕过登录控件。
在cms的Page_Load事件中。添加以下代码

protected void Page_Load(object sender, EventArgs e)
{
    if ( !Request.IsAuthenticated)
    {
        Response.Redirect("~/tools/default.aspx");
    }
}