65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.27/5 (32投票s)

2006年11月3日

6分钟阅读

viewsIcon

423067

downloadIcon

706

本文将向您展示 ASP.NET 登录控件 (2.0) 的两个基本用途:登录任务本身,用于验证试图访问您网站的用户。此外,我将展示如何使用 cookie 实现 REMEMBERME 过程,以将用户名保存在用户 PC 中。

引言

登录控件是一个很好的礼物,可以节省时间,用于完成您在开发网站时最重要的任务之一,即登录任务(谁进,谁出)。在接下来的几行中,我将尝试提供一个基本但功能齐全的登录控件编程,您可以将其用于您的项目。

 

本程序的目的是首先显示登录页面(那里有登录控件),用户输入他们的登录凭据(用户名、密码),页面会根据数据库评估凭据,如果用户存在且密码与数据库中保存的密码相同,则登录页面将授予访问欢迎页面的权限,反之,登录页面将刷新并显示登录错误消息,并准备再次尝试。

 

 

Sample screenshot

 

图 1. 登录过程

 

 

第一步。

启动一个新的 Asp.net 项目。

开始创建两个窗体:登录窗体和欢迎窗体(目标窗体)。

 

*登录窗体 (login.aspx)

*欢迎窗体 (welcome.aspx)

 

窗体控件。

 

登录窗体 (login.aspx)

添加登录控件。(Logeo)

 

欢迎窗体 (welcome.aspx)

添加一个标签(Message)。

 

现在,让我们专注于登录控件(在此示例中命名为 Logeo)。

 

如果您想更改默认皮肤,请查看下图,然后点击自动格式化 > 经典,以便更改为 Windows XP 皮肤。

 

 

Sample screenshot

 

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

 

通过以上几行,我们拒绝了所有匿名用户的访问。

 

 

 

Sample screenshot

 

图 3. 访问您的网站只有一条路,那就是登录窗体。

 

 

此时,我们已经实现了目标,所有访问我们网站中任何窗体的尝试都会重定向到登录窗体,并且只有注册用户才能通过该窗体。

 

现在我们来实现下次记住我的功能,将用户名保存在 cookie 中,并且每次用户加载登录页面时,我们都可以从 cookie 中读取用户名。

 

这是逻辑过程:

 

Sample screenshot

 

图 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。

 

 

Sample screenshot

 

图 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 上保存“下次记住我”功能的实现方法,请注意您在那里保存的所有信息。因为有经验的用户可以读取它。

 

结论

还有更多复杂的方法可以登录注册用户,所以这是最基本、最容易实现的登录任务之一,请享受它。

此任务看起来很难,但您可以将其变得尽可能简单,欢迎您进行任何更改。

© . All rights reserved.