如何实现 Asp.net 登录控件 2.0 的两个基本用途(登录和记住我)






3.27/5 (32投票s)
2006年11月3日
6分钟阅读

423067

706
本文将向您展示 ASP.NET 登录控件 (2.0) 的两个基本用途:登录任务本身,用于验证试图访问您网站的用户。此外,我将展示如何使用 cookie 实现 REMEMBERME 过程,以将用户名保存在用户 PC 中。
引言
登录控件是一个很好的礼物,可以节省时间,用于完成您在开发网站时最重要的任务之一,即登录任务(谁进,谁出)。在接下来的几行中,我将尝试提供一个基本但功能齐全的登录控件编程,您可以将其用于您的项目。
本程序的目的是首先显示登录页面(那里有登录控件),用户输入他们的登录凭据(用户名、密码),页面会根据数据库评估凭据,如果用户存在且密码与数据库中保存的密码相同,则登录页面将授予访问欢迎页面的权限,反之,登录页面将刷新并显示登录错误消息,并准备再次尝试。
图 1. 登录过程
第一步。
启动一个新的 Asp.net 项目。
开始创建两个窗体:登录窗体和欢迎窗体(目标窗体)。
*登录窗体 (login.aspx)
*欢迎窗体 (welcome.aspx)
窗体控件。
登录窗体 (login.aspx)
添加登录控件。(Logeo)
欢迎窗体 (welcome.aspx)
添加一个标签(Message)。
现在,让我们专注于登录控件(在此示例中命名为 Logeo)。
如果您想更改默认皮肤,请查看下图,然后点击自动格式化 > 经典,以便更改为 Windows XP 皮肤。
图 2. 登录控件皮肤向导。
那是皮肤更改;现在让我们进行逻辑更改以使用登录控件。
保留所有属性的默认值,并更改此属性。
DestinationPageUrl = welcome.aspx 登录成功时转到 welcome.aspx
确保已验证属性为 false(登录控件)。
现在让我们验证在文本框中输入的用户名凭据,成功时转到 DestinationPageUrl 属性中写入的 URL,失败时重新加载窗体。
登录控件的此代码在身份验证过程中会评估用户凭据,并授予或拒绝访问目标页面的权限。
protected void Logeo_Authenticate(object sender, AuthenticateEventArgs e)
{
try
{
string id_user = Logeo.UserName.Trim(); //从控件获取用户名
string pass_user = Logeo.Password.Trim(); //从控件获取密码
//这是 SQL 和连接示例
string sql = "SELECT coduser, nameuser FROM users WHERE iduser = @param_Id AND passuser = @param_Password";
public SqlConnection conexionExpress = new SqlConnection("server='localhost\\SQLExpress';Integrated Security=true;Initial Catalog=college;User Instance=false"); //创建服务器连接
SqlCommand comandoSql = new SqlCommand(sql, conexionExpress); //使用 SQL 字符串和 SQL 连接创建 SQL 命令
//添加 SQL 参数
comandoSql.Parameters.AddWithValue("@param_Id", id_user); // VS 2.0 新增
comandoSql.Parameters.AddWithValue("@param_Password", pass_user);
string cod_user = "";
string name_user = "";
//打开数据库连接
conexionExpress.Open();
SqlDataReader dr = comandoSql.ExecuteReader();
while (dr.Read())
{
cod_user = dr.GetValue(0).ToString(); // coduser 在数据库表中是唯一的
name_user = dr.GetValue(1).ToString();
}
conexionExpress.Close();//关闭数据库连接
if (cod_user != "") //用户存在于数据库中
{
/*创建会话变量
Session["coduser"] = cod_user;
Session["nameuser"] = name_user;
e.Authenticated = true; //授予访问权限,转到 DestinationPageUrl
}
}
catch(Exception)//登录错误时
{
e.Authenticated = false;//确认您已被拒绝
conexionExpress.Close();//在任何错误情况下,关闭数据库连接
}
}
现在我们将修改欢迎页面以显示授予访问权限的用户的用户名。
在 welcome.aspx 中修改 load 事件。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Message.Text = "Welcome " + Session["nameuser"].ToString() + " Your user code is " + Session["coduser"].ToString();
}
}
此时,您已经在网站中完成了登录事件,但我们遇到了一个问题:如果用户输入欢迎页面的绝对 URL,他们仍然可以访问该页面,所以让我们在 web.config 文件中添加以下几行,以将所有访问窗体(使用绝对 URL)的尝试重定向到登录窗体。
将身份验证模式更改为 Forms,并添加以下内容以锁定您的站点,最后将登录窗体的 URL 定义为默认窗体。
<authentication mode="Forms">
<forms loginUrl="login.aspx" protection="All" defaultUrl="login.spx">
</forms>
</authentication>
为了防止匿名用户尝试访问我们的网站,我们必须修改 web.config 文件中的 authorization 元素。
<authorization>
<deny users=?/>
</authorization>
通过以上几行,我们拒绝了所有匿名用户的访问。
图 3. 访问您的网站只有一条路,那就是登录窗体。
此时,我们已经实现了目标,所有访问我们网站中任何窗体的尝试都会重定向到登录窗体,并且只有注册用户才能通过该窗体。
现在我们来实现下次记住我的功能,将用户名保存在 cookie 中,并且每次用户加载登录页面时,我们都可以从 cookie 中读取用户名。
这是逻辑过程:
图 4. 在 PC 客户端读取和创建 Cookie 的逻辑过程。
在上图中,您可以看到要实现的第一步是从用户 PC 读取 cookie,如果存在(cookie),则读取 cookie 并将用户名参数写入登录控件的用户名文本框。
此处必须在 onload 过程(login.aspx)中实现此过程。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)//首次加载时
{
if (Request.Cookies["myCookie"] != null) // Cookie 是否存在??
{
HttpCookie cookie = Request.Cookies.Get(myCookie");
string user = cookie.Values["user"].ToString();
if (user != "")
{
Logeo.UserName = user; //将用户名写入登录用户名文本框
}
}
}
}
已经完成了读取 cookie 的过程,现在我们必须实现另一个任务:将用户名写入 cookie。
图 5. 记住我复选框。
当您按下登录按钮时,会触发登录过程,此时我们必须在此处编写 cookie 的创建过程语法,请查看以下代码行。
protected void Logeo_LoggedIn(object sender, EventArgs e)
{
CheckBox chBox = (CheckBox)Logeo.FindControl("RememberMe");
if (chBox.Checked)
{
HttpCookie myCookie = new HttpCookie("myCookie"); //实例化新 cookie
Response.Cookies.Remove("myCookie"); //删除之前的 cookie
Response.Cookies.Add(myCookie); //创建新 cookie
myCookie.Values.Add("user", this.Logeo.UserName); //将用户名字段添加到 cookie
DateTime deathDate = DateTime.Now.AddDays(15); //有效期天数
Response.Cookies["myCookie"].Expires = deathDate; //分配有效期
//如果您想保存密码(不推荐)
myCookie.Values.Add("pass", this.Logeo.Password);
}
}
以上就是使用 cookie 在用户 PC 上保存“下次记住我”功能的实现方法,请注意您在那里保存的所有信息。因为有经验的用户可以读取它。
结论
还有更多复杂的方法可以登录注册用户,所以这是最基本、最容易实现的登录任务之一,请享受它。
此任务看起来很难,但您可以将其变得尽可能简单,欢迎您进行任何更改。