有时候我们的一个站点,有些页面是必须登录用户才有权限进行访问的,这时候,就需要验证这个用户有没有登录过。并且,当用户完成操作后要有让用户退 出的机制。传统的方法是使用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:下面就可以用前面配置文件中设置的用户名跟密码登录一番试试了。。。