使用一个数据库表进行基本登录
本文关键字:登录 数据库 一个 | 更新日期: 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");
}
}