探索中国CIO人才现状 | 第四季调研报告
ASP.net中基于RBAC的通用权限管理系统
2014-03-04  作者:万方数据 

  在Web应用系统中,权限管理是最重要的组成部分之一,担负着用户分级分类管理、系统和数据的访问控制等萤要职责。但是,由于权限管理实现的复杂性,设计一个好的权限管理子系统并非易事。同时,由于不同系统之间资源的差异性大,为一个系统设计的权限管理子系统往往不能在其他系统中通用,而需要重新专门设计,浪费人力物力,因此一个良好的通用权限管理子系统对Web应用系统的设计和实现具有重要意义和应用价值。基于角色的访问控制(RoleBasedAccessControl,RBAC)是目前比较成熟、应用比较广泛的统一资源访问控制方法,其核心内容包括用户、角色和资源三部分。ASEnet提供了对用户和角色进行管理的良好实现。如果能添加对资源管理的良好实现,就能以其为基础,设计一个更为完善的权限管理子系统。


  1需求分析


  为了便于分析和设计,将权限管理所涉及的内容划分为5个部分:甩户,角色,文件,菜单和权限。菜单与应用程序中具有独立功能的模块(在Web应用程序中指一个或多个网页)相对应,应用程序通常用菜单来管理它们。权限指模块实现的基本功能,如读和写。下面以图1所示的RBAC96模型为依据进行需求分析,该模型的基本理论见文献。


  ASP.net中的实现部分包含在图1的虚线框内,主要包括用户管理、角色管理以及与其相关的会话管理。但这些都只实现了基本功能,应用中常需要对它们进行扩展。


  在前台,ASP.net提供了与用户管理相关的各种控件,由此实现了诸如用户注册、密码修改、密码找回、用户状态检测等常用的基本功能。可对它们进行修改和扩展。在后台,ASP.net提供了实现用户和角色管理所必需的数据库和表,它们由系统自动创建,并通过相关对象(UsegRoles,Membership和MembershipUser)自动管理,实现了用户和角色的创建、编辑、删除、获取等功能。可对这些表进行修改和扩充,对这些对象进行扩展。此外,ASP.net还可通过Webconfig文件配置文件和目录的访问授权。相应的访问控制由ASEnet框架自动完成。


  总之,ASP.net中的RBAC已经实现了对用户、角色和文件的基本管理,在应用中只要根据需求加以修改和扩展即可。对于菜单和权限的管理,则必须由程序员实现,这是通用权限管理子系统实现的重点,主要的实现有权限(操作)、菜单和页面(对象)及它们之间的关系(操作与对象间的联系)。


  2基于RBAC的通用权限管理系统设计


  (1)用户管理


  一个比较完备的用户管理应包括以下功能:注册,登录,密码修改,密码找回,用户信息获取,当前用户状态获取,用户的添加、删除、资料修改等。前6项功能可以由ASP.net提供的控件实现,其他功能则需要由程序员实现。另外,还可以实现基于组的用户管理功能,以方便权限分配与回收。Membership对象可完成用户的添加和删除,但如果要增加用户详细资料信息,则需要对其进行扩展。


  (2)角色管理


  主要实现角色的添加、删除、修改和分配,均可通过Roles对象完成。还可以实现基于用户组的角色分配功能,以方便权限分配与回收,但需要对Roles对象进行扩展。


  (3)资源管理


  主要实现2项功能:控制对菜单(通常对应模块的首页)的访问(粗粒度),控制角色对某个网页的访问权限(细粒度)。实现这些功能必须自定义对象。


  (4)数据库和表


  对于ASP.net自动创建和维护的库和表,除非对它们进行扩展,否则无须关心。需要做的是添加一些对用户资料、用户组和资源进行管理的表,如用户资料表、用户组表、资源表、权限表。


  (5)系统架构


  系统框架为3层设计,见图2,最下层是数据库;最上层是页面;中间层是对象,对下负责数据库操作,对上完成页面数据的存取。各层相对独立,方便系统的修改和扩充。图2中的用户与角色指ASP.net自动创建的11个表。加下划线的部分必须由程序员设计和实现,而其他部分可以借助ASP.net提供的对象和表来实现。因为文件和目录的权限管理可以直接通过ASP.net框架完成,所以未在图2中标出。


  (6)权限表示


  权限最简单的表示方法是使用O(无权)和l(有权)。它们可以是一个二进制位,也可以是一个字符。使用二进制位的优点是运行速度极快,解读方便,但表示的权限数有限;使用字符的优点是可以表示的权限数很大,但解读相对较慢。一种资源的权限通过多个0和l来表示,每个代表一种权限。32位系统中的一个整数最多能表示64种权限,因为一般的应用程序不会用到这么多种权限,所以这种方法是可取的,在一般的应用中是合适且足够的。


  3关健实现与实例


  用户资料修改、用户组、角色按组分配等功能的实现比较容易,仅作简要描述。用户资料是指用户的详细情况,一般只作显示用,只要增加相应的表即可。组的实现与Windows中的组类似,每个用户都属于某个或某些组,每个组具有某种或某些角色。使用组的好处是可以大大降低为很多用户分配多种角色的工作量,简化操作的同时降低了出错机率,增强了用户体验。用户、组和角色三者的关系可以表示为:用户属于一用户组+_角色分配给。


  文件和目录的权限管理只需手工配置Web.config文件即可,也可以由程序员设计相应的管理程序。下面给出资源管理的实现及其实例。


  (2)权限的实现


  权限的实现采用基于整数二进制位的方法,示例如下:用户定义如表4所示的权限时,系统将自动按从低位到高位的顺序生成掩码。之后添加、删除、修改模块基本权限和用户的访问权限以及解读权限时,均严格与表4一一对应。整个过程对用户完全透明。权限解读非常简单高效,将某角色对某资源的访问权限值与操作掩码进行与运算,结果与掩码相等则具有该掩码对应的权限,反之则没有。


  (3)粗粒度访问控制


  粗粒度访问控制的功能是对用户能够访问的系统模块进行控制。只有被授权的模块,用户才能访问,反之则不能。资源采用统一编码,每个页面对应一个编码。每个页面都根据其实现的功能被赋予一定数量的基本权限。其中,“查看”作为一种最基本的权限而存在,默认每个页面都具有这种权限。如果某用户被授予某页的“查看”权限,则该用户可以访问该页,反之则不能。


  菜单项默认代表系统中某模块的首页。未获得菜单项“查看”权限的用户将无法在菜单中看到该项。菜单组仅用作显示)也作为一种资源予以编码。未获得菜单组“查看”权限的用户将无法在菜单中看到该组及该组下的所有项。当用户以直接HTTP方式在浏览器中请求执行某个页面时,系统将同时检测该用户对该页和该页所在组的“查看”权限,如果有一项未被授予,则禁止访问。总之,由于网页加载时会检测当前用户的访问权限,因此未被授权的用户无论通过何种方式均不能访问,只有被授权的用户,才能通过检查。