开篇
做任何系统都离不开和绕不过权限的控制,尤其是B/S系统工作原理的特殊性使得权限控制起来更为繁琐,所以就在想是否可以利用IIS的工作原理,在IIS处理客户端请求的某个入口或出口通过判断URL来达到控制权限的目的,这样就可以减少通常要在每个页面或按钮都要添加的权限验证代码。
通常的权限验证模式
一般的权限验证会控制到菜单(页面)就可以满足,复杂一点的会要求控制到按钮(功能点),这个都需要做一下几点工作:
1.按权限生成菜单,这是所有系统都要做的;
2.在每个页面的开始处添加登录和权限的验证,调用公共的验证方法,这个地方经常将页面的编号搞混;
3.隐藏(或这直接不生成)页面上没有权限的按钮;
4.在功能的响应点添加权限验证代码,添加、修改、删除等功能的后台处理入口处加判断。
这四个步骤中2、3、4都是比较繁琐的,非常容易搞错页面或功能的编号(通常是复制过来忘记修改),B/S系统要做好权限验证杜绝漏洞这四个点的控制都很重要的,当然不需要控制到按钮的第三步就可以省略了,有些时候大家会忽略对第四步的验证,比如在调用.ashx(一般处理程序)页面处理操作请求时,并没有在.ashx后台的代码中进行权限(或登录)验证,这样就存在安全隐患了。
新的的权限验证模式设计
新的权限验证模式想要达到的目的是将上面的 2、3、4繁琐的权限验证调用去掉,在IIS处理请求的总入口或出口通过请求的URL判断是否有权限,根据判断的结果对请求进行不同的处理(终止、跳转、提示或正常处理)。
通过查阅互联网资料发现可以通过httpModules来实现,对httpModules的详细介绍请参照点击打开链接
httpModules介绍博客地址: http://www.cnblogs.com/chenlulouis/archive/2009/12/18/1626918.html
通用权限验证组件设计:
1.选择在httpModules的PreRequestHandlerExecute事件作为权限验证控制点,在这个事件前面的其它事件Session还没有生效无法取到用户信息,越往后的事件所处理完成的请求越多,权限认证肯定是越早越好,所以就选择了这个事件。
2.通过配置文件控制权限的验证,需要配置的点主要有:
2.1基础配置:数据库连接字符串、URL截取规则、登录页面(为登录时跳转)、提示信息(没有权限时)、登录验证Session标志;
2.2验证URL:URL拼接参数配置(有些页面要拼接参数后作为整体判断权限);
2.3需验证页面:限定验证范围,图片、js文件这些肯定是不需要验证的,需要验证的通常情况下也都是可预知的,可按后缀名或路径配置;
2.4忽略验证页面:在需要验证的配置范围内有些页面是不需要验证的,如登录页、主框架页、修改密码等,可按后缀名或路径配置;
2.5权限查询语句:根据取到的URL判断登录用户是否有权限的SQL语句和语句参数;
2.6字功能查询语句:查询有权限的子功能的SQL语句和语句参数,权限需要控制到按钮时才需要。
3.实现参数的导入、解析按配置的要求实现权限的验证控制。
结尾
这样一个简单的ASP.NET通用权限验证组件就设计完毕了,接下来就是用代码实现了,本人计划用C#代码实现这个设计,主要是想通过这个组件的开发加深对IIS工作原理的认识和理解,提升开发通用功能的能力。
ASP.NET通用权限组件思路设计