最近因为项目代码重构需要重新整理用户登录和权限控制的部分,现有的代码大体是参照了.NET的FORM认证,并结合了PORTAL KITS的登录控制,代码比较啰嗦,可维护性比较差。于是有了以下的几个需求(大多数系统应该都会碰到):
1.用.NET自带的FORM认证来实现安全登录
2.登录后需要记录登录用户的基本信息,方便所有页面调用
3.记录本机登录状态,短时间关闭窗口后不用重新登录
4.权限控制和代码的文件夹结构相呼应,即按角色允许访问不同的目录
5.权限控制有可能需要细化到每一个页面,即按角色允许访问不同的页面
6.以上的部分尽量自己少写代码,用自带的类库和机制实现
第一步:准备工作
先准备一个名为Test的WEB项目,包含:
Default.aspx,默认页,随便显示一些信息,
Login.aspx,登录页,上面放两个文本框,用来输入用户名和密码,一个登录按钮,一个指向Register.aspx的超链,
Register.aspx,用户注册页,注册用户信息,随便放一点文本框,主要是模拟一下注册,不用真正实现,
Web.config,配置页面。
注册页与登录页在同一目录的机妙后面会说。
第二步:Web.config文件的修改
1、打开Web.config文件,找到authentication节,将其改为如下:
<authentication mode="Forms"> <forms loginUrl="Login.aspx" protection="All" path="https://www.jb51.net/" timeout="20"/> </authentication> <authorization> <deny users="?"></deny> </authorization>
配置节属性的具体意义和其他没有加入的属性网上到处都有查。这里注意一下的是authentication节和authorization节,两个单词很相似,但却不是同一个单词,每个节下面的内容也不能写到一起。
其中,authorization节中的“allow”表示允许的意思,“*”表示所有用户;而“deny”表示拒绝的意思;“?”表示匿名用户;此处加入后,则代表根目录下的所有文件和所有的子目录都不能匿名访问,Login.aspx 页面除外。
2、Web.config中,Location节的应用
做了上面的配置之后,我们会发现,在没登录的情况下,用浏览器打开Default.aspx会自动转到Login.aspx,同理Register.aspx页面也会如此。问题:注册用户怎么可能在登录后才能访问呢?
那么我们就得说了,当注册页与登录页在同一目录,为了达到不用登录就能访问注册页的目的,我们就得对访问限制的Web.config配置处理一下。
方法一 :注册页与登录页放在不的目录内
我们在根目录添加一个文件夹Pub,将Register.aspx移动到此文件夹里,此时仍不能访问,需要在文件夹内添加一个Web.config文件,加入:
<configuration> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </configuration>
此处,即说明此目录下的所有文件,允许所有人访问。
关于 Web.config 作用范围的说明:
• Web.config 的设置将作用于所在目录的所有文件及其子目录下的所有东东(继承:子随父姓)
• 子目录下的 Web.config 设置将覆盖由父目录继承下来的设置(覆盖:县官不如现管)
• 也就是,属性设置由最深一层的目录里的Web.config决定;如果子目录里没有Web.config文件,则由离它最近的父目录里的Web.config决定
方法二:仍然保持注册页和登录页在同一目录下
只需要在根目录下的Web.config 中加入以下一段:
<location path="Register.aspx"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location>
通过location节的path属性的值指定Register.aspx页面,以及下面authorization节的设置,说明了Register.aspx页面是允许被所有人访问。
注意:
location节应加在原有的system.web节的外面,包含在configuration节内,和system.web节是同级的。
当根目录下,有多个页面不需要登录就可以访问时,可以设置多个location节,修改对应path属性值指向的页面就可以了。
另外,path属性的值也可以指定目录,用来指定该目录的访问限制。通过修改authorization节的内容来限定访问权限。详细的设置,后面会提到。
第三步:实现登录的代码
1、普通的代码实现
方法一:
如果forms节中设置了“defaultUrl”的属性,也就是登录后默认转向的页面,则可以用如下的方法: