Posted on 2006-03-01 15:19
云自无心水自闲 阅读(1942)
评论(0) 编辑 收藏 所属分类:
.Net
表单认证是Asp.net中最Cool的功能之一,一般来说应用都会要求输入认证信息(典型的是用户名和密码)。
在Web.config的设置项中,可以指定登录页面和哪些资源需要保护。当用户第一次访问被保存的资源时,应用会自动定向到指定的登录页面。
如果成功登录,ASP.NET会转到用户初始请求的页面。
以往的应用需要在每个页面的顶部判断用户是否成功登录,手工定向到登录页面,而现在这个工作由表单认证简单地完成了。
举个简单的例子来说明开发过程:
一个应用中有两个页面PublicPage.aspx是向公众开放的,PrivatePage.aspx只允许登录用户才能访问。
第3个页面是登录页面,要求输入用户名和密码。
步骤如下:
1、把PublicPage.aspx, login.aspx, web.config拷贝到一个IIS的虚拟目录下。
2、创建一个子目录Secret,将PrivatePage.aspx, web.config拷贝到子目录中。
3、在web.config中添加以下代码, 实现访问保存页面自动跳转登录页面的功能
<authentication mode="Forms">
<forms loginUrl="LoginPage.aspx">
....
</forms>
</authentication>
4、另外有一个<credentials>小节列出合法用户和密码
<credentials passwordFormat="Clear">
<user name="Jeff" password="imbatman" />
<user name="John" password="redrover" />
<user name="Bob" password="mxyzptlk" />
<user name="Alice" password="nomalice" />
<user name="Mary" password="contrary" />
</credentials>
此例子中关掉了的加密选项,缺省是开的。
5、在Secret子目录的web.config中添加以下代码,实现保护功能。
<authorization>
<deny users="?" />
</authorization>
这是用于通知权限管理模块System.Web.Security.UrlAuthorizationModule阻止未登录用户的访问。"?"代表匿名用户,也可以说是未登录用户。
实际的权限验证是由Login.aspx完成的。下列语句
if(FormsAuthentication.Authenticate(UserName.Text,Password.Text))
把用户名和密码传给System.Web.Security.FormsAuthentication,如果验证成功,返回True。并且执行页面跳转语句
FormsAuthentication.RedirectFromLoginPage(UserName.Text,false);
6、真实环境的表单认证比上面的例子要复杂的多,真实应用不大可能把用户和密码保存在文本文件中,比较常见的是存放在数据库中。
假定用户表Users有3个字段UserName, password, Role.
对于这种情况,我们需要在刚才的基础上进行2个地方的修改:Login.aspx、web.config(根目录下的)
在web.config中不再需要<credentials>小节了。
login.aspx也不再使用 FormsAuthentication.Authenticate 来验证密码,而使用CustomAuthenticate替代。
在这个方法中使用Sql查询语句来判断用户是否合法。