有时候我们的一个站点,有些页面是必须登录用户才有权限进行访问的,这时候,就需要验证这个用户有没有登录过。并且,当用户完成操作后要有让用户退 出的机制。传统的方法是使用cookie保存登录信息,如果在用户机器上找不到,那么就拒绝用户访问。而ASP.NET中,既然是WEB开发的框架了,就 应该把这个功能封装得更强大易用。这就是所谓的表单验证。

 

要在ASP.NET中实现表单验证,需要做以下2步:

 

1: 准备一个登录页面,既然你的某页面不允许未登录用户访问,那么,这时就要跳转到登录页面去,这是很合理的一个处理方式。

2:在 WEB.CONFIG中配置相关项目。

 

就是这么简单,下面是一个登录页面示例:

 

protected void btLogIn_Click(object sender, EventArgs e)
        {
            string userName = txUserName.Text;
            string password = txPswd.Text;
            
            using(StreamReader sr = File.OpenText
        ("D:\\My Documents\\Visual Studio 2008\\Projects\\Project1\\MyWebIM\\MyWebIM\\user info.txt"))
            {
                string input =null;
                while((input=sr.ReadLine())!=null)
                {
                    if (input == userName)
                    {
                        input = sr.ReadLine();
                        if (input == password)
                        {
                            User currUser=new User(userName,password);
                            Global.MyHome.adduser(currUser);
                            FormsAuthentication.RedirectFromLoginPage(userName, false);
                            break;
                        }
                    }
                }
            }
        }

其 中关键的只是这一行:

FormsAuthentication.RedirectFromLoginPage(userName, false);

这一行告诉了ASP.NET环境,如果用户验证通过了,就设置一个当前用户的有效cookie信息,并跳往在WEB.CONFIG文件中定义的那个default值所 在页面。

它至少完成了以下任务:

1:它为用户创建了一个验证TICKET,

2:它对这个TICKET中的信息进行了加密,

3:它创建了一个cookie来保存加密的TICKET,

4:它将cookie添加到HTTP响应,并把它发送到客户端,

5:它将用户重定向到原先请求的页面(包含在登录页面请求URL的查询字符串参数中)。

该方法的第二个参数表示是否应当创建一个持久化的cookie.持久化cookie被存放在用户的硬盘中,可以在后续访问中重用。

web.config中的定义如下:

<authenticationmode="Forms">
      <forms 
        defaultUrl="UserHome.aspx"
        loginUrl="Login.aspx"
      />
    </authenticationmode> 
  <location path="UserHome.aspx">
    <system.web>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
  </location>

这 两块,第一块在VS2008默认生成的页面中就有,但是是注释掉的,把它释放开就好了,但要注意把下面那个authorization小节删除掉,因为它 规定了所有页面都不能由匿名用户访问系统资源,会导致登录页面上的图片什么的资源显示不出来。所以要单独为其它的页面设置authorization这个 小节,而不包括登录页面。设置方法如第二块所示。

这样处理过后,你再在浏览器中直接打上面所示的 UserHome.aspx 地址,已经无法访问了,而是会自动跳转到我们指定的loginUrl : Login.aspx 页面去。这样我们的登录限制就加好了。下面还要处理用户的退出方法。

 

退出很简单,只要在页面中的某个地方加一个LOG OFF的按钮或者其它的什么玩意儿,然后添加如下的响应代码:

 

            FormsAuthentication.SignOut();
            FormsAuthentication.RedirectToLoginPage();

 

即可,傻子都能看明白这是什么意思,呵呵。

 

关于表单验证当然还有很多细节以及要考虑到的安全问题,暂时先学到这儿。先广后深。


 

我自己的Login 控件实验过程:

1:新建一个空白Website,

2:把Default.aspx 改名 为 Login.aspx

3:配置web.config:

加入:

 

       

<authentication mode="Forms">
          <forms>
            <credentials passwordFormat="Clear">
              <user name="Bill" password="secret" />
              <user name="Ted" password="secret" />
            </credentials>
          </forms>
        </authentication>

 

这块放在system.web 下面,然后:

 

<location path="Secret.aspx">
      <system.web>
        <authorization>
          <deny users="?" />
        </authorization>
      </system.web>
    </location>

 

这块放在 system.web 外面。

 

4:Login.aspx 主要内容如下:

 

<head runat="server">
    <title>Untitled Page</title>
    <style type="text/css">
        .login
        {
            width: 250px;
            font: 14px Verdana,Sans-Serif;
            background-color:Gray;
            border: solid 3px black;
            padding: 4px;
        }
        .login_title
        {
            background-color:Silver;
            color: black;
            font-weight: bold;
        }
        .login_instructions
        {
            font-size: 12px;
            text-align: left;
            padding: 10px;
        }
        .login_button
        {
            border: solid 1px black;
            padding: 3px;
        }
    </style>
</head>
<body>
    
    <form id="form1" runat="server">
    <div>
        <asp:Login ID="Login1" InstructionText="Please log in before accessing the premium section of our Website." 
            OnAuthenticate="Login1_Authenticate"
            TitleText="Log In" 
            TextLayout="TextOnTop"
            LoginButtonText="Log In" 
            DisplayRememberMe="true" 
            CssClass="login" 
            TitleTextStyle-CssClass="login_title"
            InstructionTextStyle-CssClass="login_instructions" 
            LoginButtonStyle-CssClass="login_button"
            runat="server"      DestinationPageUrl="Secret.aspx" />
    </div>
    </form>
</body>
</html>

 

5: Login.aspx.cs 中定义前面提到的验证函数:Login1_Authenticate 如下:

 

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
    {
        string userName = Login1.UserName;
        string password = Login1.Password;
        e.Authenticated = FormsAuthentication.Authenticate(userName, password);
    }

 

6:准备一个站点内部的不允许外部未经登录就访问的页面,当然名字是前面 DestinationPageUrl="Secret.aspx" 属性指定的这个Secret.aspx 这个属性本来是当直接访问Login.aspx页面进行登录完毕后的默认跳转页面,默认值是 Default.aspx 但是现在因为项目中没准备这个,那就让它暂时跳转到这儿吧,如果是直接访问某内部页面,那么先是跳转到 Login.aspx ,然后登录成功后就跳转到初始的访问页面。

 

7:下面就可以用前面配置文件中设置的用户名跟密码登录一番试试了。。。