试析ASP.NET MVC3基于角色的访问控制
2013-04-29时枫棋黄海涛陈军伟
时枫棋 黄海涛 陈军伟
摘 要:网站的一个典型要求是,只允许某些用户(经过身份验证的用户)查看特定的页面。基于角色的访问控制策略(RBAC)通过在用户和权限之间引入角色,弥补了传统方法的某些缺陷。传统的访问控制需要程序员编写大量代码来实现,使用ASP.NET MVC3提供的角色管理,可以快速建立起健壮,功能强大的基于角色的访问控制。
关键词:ASP.NET;MVC;基于角色的访问控制;WEB安全
在基于Web的信息系统中,由于网络信息共享的特性,系统的安全问题越来越突出,安全性研究越来越重要,对用户访问进行控制是保证系统安全的重要措施之一。以往在对Internet开放的网站上设计实现一个用户权限控制管理系统通常都要花费很多的时间。ASP.NET MVC3内置了基于角色的访问控制模块,实现基于窗体的用户身份验证和权限控制功能,这里浅析其实现方式。
1 Forms身份验证的原理
ASP.NET在Internet上的应用程序广泛采用Forms身份验证方式。由于HTTP协议是无状态的,WEB服务器每次在处理请求时,都会按照用户所访问的资源所对应的处理代码,从头到尾执行一遍,然后输出响应内容,WEB服务器不会记住已处理了哪些用户的请求。
虽然HTTP协议是无状态的,我们的业务需求却要求WEB服务器能够记住用户的身份,验证用户的权限。这通常是通过Cookie或者Session来实现,他们都可以保存用户的身份凭据,在不同的HTTP请求之间维持状态。Forms身份验证也是通过这两种方式来实现,既可以读取用户浏览器中加密存储的Cookie,在浏览器不支持Cookie的情况下也可以使用SessionID来实现身份验证。只需要在Web.config文件中简单配置即可。
用户身份验证是用户权限控制的基础。
2 ASP.NET MVC3基于角色的权限控制
ASP.NET MVC3提供了几个关键类来管理用户验证与授权功能
Membership集中了用户账户的创建、删除,密码的重置与修改等与用户账户密切相关的功能。
Roles将用户与角色联系在一起,一个用户可以属于多个角色,以此来对用户进行不同的授权。
Profiles用来存储用户的任意个人数据,如用户的昵称、偏好等数据。
以上关键类提供的功能,其具体实现只需要在Web.config文件中配置成微软提供给我们的提供者(Provider)即可。
這充分体现了面向对象思想的针对接口编程的特点,我们可以编写自己的Provider来替换掉默认的Provider从而实现功能扩展。微软提供的默认实现可以很好的工作在大部分场景中,而且如果将来有必要升级到自己的方案,也无需对程序做出大量改动。
XML格式的配置文件清晰易读,并且提供了丰富的配置选项,可以方便的设置密码最小长度,密码最大错误次数,是否允许找回密码、是否允许重置密码等多种参数。
3 将权限控制与MVC架构结合
不同于ASP.NET WEB应用程序,在MVC3架构下,URL与物理页面之间不再存在一一对应关系。MVC3架构中URL要首先经过路由(Router)处理,分析之后通过路由规则匹配到对应的Controller,由Controller负责呈现页面。而路由规则是可以经常变化的。以往在ASP.NET WEB应用程序中对页面设置访问权限的办法已经不再适用。所以我们现在使用过滤器(Filter)来给用户授权。
最常用的权限过滤器是[Authorize],用于Controller类或者Controller方法上,表示此类中的所有方法或者某个方法只有通过验证的用户才能调用。加入参数之后如[Authorize(Roles=”Admin”)]表示只有属于Admin用户组的用户才可以调用此方法。Authorize过滤器可以被继承,方便开发者编写自己的授权方法。使用过滤器来进行访问控制是AOP编程在WEB开发中的经典模型。
4 结语
ASP.NET MVC3向广大开发者提供了不用编写复杂代码就可以使用的功能全面的基于角色的用户访问控制方案。这套方案的扩展性也相当好,如果掌握了自定义Provider和Filter的编写方法,完全可以实现更多的高级功能,满足各种业务场景的需要。
[参考文献]
[1]Adam Freeman,Steven Sanderson. Pro ASP.NET MVC3 Framework Third Edition,Apress,2011.