0

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

有了这个,我正在尝试开发一个非常基本的登录,但我无法理解这个过程。

这是我的整个应用程序的 web.config:

<?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>

用于登录的 Web.config:

<?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 的访问,但登录永远不会重定向到该页面。

任何见解将不胜感激!

4

1 回答 1

1

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

自定义身份验证方案应将 Authenticated 属性设置为 true 以指示用户已通过身份验证。

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

FormsAuthentication.SetAuthCookie(Login1.UserName, true);

此外,我将尝试以 ExecuteScalar 返回具有该用户名和密码的用户计数的方式更改您的代码。这样 ExecuteScalar 将永远不会返回 NULL,但如果没有用户存在则该值可能为零,如果用户存在则返回 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.aspx 页面的 url。
所以在 cms.aspx 的 Page_Load 事件中添加这段代码

protected void Page_Load(object sender, EventArgs e)
{
    if ( !Request.IsAuthenticated)
    {
        Response.Redirect("~/tools/default.aspx");
    }
}
于 2013-05-05T21:36:17.070 回答