开发者社区> 狼人2007> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

一起谈.NET技术,ASP.NET MVC Membership 权限 漫谈

简介:   以前一位同事习惯于使用Membership来进行权限管理,现在随着ASP.NET MVC的引入,采用以前的方法,提出了以下方案:   ASP.NET MVC+Membership结合,通过在web.config中进行配置,来管理系统中的权限。
+关注继续查看

  以前一位同事习惯于使用Membership来进行权限管理,现在随着ASP.NET MVC的引入,采用以前的方法,提出了以下方案:

  ASP.NET MVC+Membership结合,通过在web.config中进行配置,来管理系统中的权限。

  于是,我对这个方案的可行性进行了分析,提出了以下疑点:

  1. 在ASP.NET 2.0的Membership中, 在Web.config中是通过物理文件和目录,那么在ASP.NET MVC中,如果在URL中直接输入物理文件和目录,是找不到这个文件的,不知道这种方式还能不能奏效。如果说不管在mvc中,通过URL Routing怎么绕,最终都会定位到物理文件和目录上,这种方式是行得通的。
  2. 如果不是文件目录结构的话,web.config这种配置是否还能用?

  关于我提出的这个疑点,当时我觉得非常的有趣。为了验证我的疑点,于是我做了一个测试。

  经过一个简单的Demo,测试结果出来了。测试结果如下:

  1. ?在ASP.NET MVC的Membership中,并不是基于文件和目录的,而是易于URLRouting的,当进行文件目录配置的话,是不起作用的,只有在web.config中进行URLRouting的权限配置才会起作用。

  最终经过测试,如果按照默认路由走的话,最终也是可以通过配置进行权限的控制。只不过是配置起来的话,要把文件路径改为“controller/action”而不是原来的“Controller/Action.aspx”。

  接下来再想一想,这样会不会有什么问题?

  1. ?以往的Webform开发,url是稳定因素(URL重写除外),所以,通过Membership进行权限设定是没有问题的。但是在MVC中,URL是不稳定因素,如果更改了routing设置,权限系统就会被绕过去。从模块职责上来说,不应该因为其它模块的更改,导致权限管理模块失效,这从设计上就是一个糟糕的设计。所以,从个人情感上来说,我认为这种设计糟糕透了。
  2. 既然URL是不稳定因素,不应该通过这个来进行权限控制,也就是说不应该通过不稳定因素来参杂权限管理。
  3. URL是不稳定的,那么较稳定的因素应该就是Controller跟Action,也就是说,无论URL怎么变,最终都可以把Controller跟Action确定下来。因此,在ASP.NET MVC中,应该通过Controller跟Action结合来进行权限控制。
  4. 了解URLRouting的朋友们一定知道,MVC中的路由是按照顺序执行的,如果满足了前面的匹配规则,将不会执行后面的匹配规则,稍稍对于URLRouting掌握不好,就会给系统的安全带来隐患。

  权限系统一般分为:稳定不变的部分、较稳定的部分、不稳定部分。因此在进行权限系统的时候就应当综合考虑这些因素。

  关于权限系统的设计,一般都会按照如下来设计:

  1. 抽象出系统中的实体部分(系统中稳定不变的部分或系统中较稳定的部分)。
  2. ?将抽象的实体部分进行抽象设计(实体类)。
  3. 设计实体类之间的存储。
  4. 分析实体类之间的关系,这些是系统中不稳定的部分,因此要将这些关系进行存储(存储在数据库中或配置文件中,方便以后进行修改)。

  经过如上的设计,一般来说当权限管理系统达到如下要求就算是合格了:

  1. 能完成基本的权限管理
  2. 当需要进行权限管理的时候,整个权限系统的架构不变,变的仅仅是数据。

  一个合格的权限系统的设计通常不够完美,所以需要结合实际情况综合考虑进行改进。至于如何改进,没有统一的方法可言。

  关于Membership,很多人都喜欢重用Membership的一些东西,可是究竟能够重用的部分有多少?

  1. ASP.NET 2.0中提供的控件,如: Login、LoginView、PasswordRecovery、CreateUserWizard、ChangePassword等,当然,这些并不是Membership的部分,但是这些通常都会跟Membership配合使用。这些控件提供了方便的开发,可是通常这些控件并不能满足要求,扩展性并不好,而且这些控件会生成很多垃圾代码如:js、css等。在带来开发方便的同时,也给扩展跟维护带来不便。最重要的一点,凡是涉及Postback的控件,在ASP.NET MVC中,全部不能使用。
  2. 数据库及数据库访问。通过执行“aspnet_regsql”命令,可以自动在数据库中创建出11张表,并且提供了若干个API方法来对这11张表进行操作。可是这11张表中的设计往往也是不符合要求的,如果进行扩展的话,就会比较麻烦。一般扩展的方法有两种:不改变原来的表,但是要建一张表跟以前的表对应,表中的Id跟原来表中一模一样;改变原来表的设计。无论是哪种方法,数据库访问部分就必须得重写,因此数据库及数据库访问的重用也变的非常低。
  3. 基于配置文件的权限控制,似乎从目前上来看,能重用的部分只有这个了。可是在ASP.NET MVC中URL是个不稳定因素,基于配置文件的权限控制这个功能的重用并不适合ASP.NET MVC的开发。

  综合对比一下,至少在ASP.NET MVC开发中,Membership所带来的重用微乎其微。

  在不同的权限管理系统中,对控制级别的要求是不一样的,如:页面访问级别、数据访问级别、控件访问级别、函数级别。。。。。。可是不论是要控制到那个级别,权限管理系统所要完成的功能都是一样的 。我们不妨给权限管理系统下一个定义:权限管理系统就是告诉其它模块用户/角色对特定的资源/功能是否具有访问的权限。

  在Webform中,用户跟角色相比,角色是不稳定因素,用户是相对较稳定的因素。因此权限系统的输入参数中我们通常会传入用户,而不输入角色,因为角色是不稳定的,至于说用户属于哪个角色,权限系统是可以查出来的。

  而在ASP.NET MVC中,用户跟角色都可以是较稳定因素,因为用户的权限控制跟角色的权限控制都是通过扩展标记属性来实现的。这是跟webform相比,权限系统设计上不一样的地方。

  ASP.NET MVC中权限控制是通过对Action的拦截实现的。实现的方式如下:

  1. 定义一个扩展属性标记类,继承自接口IActionFilter的抽象类ActionFilterAttribute。
  2. 重写ActionFilterAttribute中的虚方法。
  3. 将扩展标记作用于Controller跟Action。

  关于ASP.NET MVC中的权限管理方案,网上已经有了,这里就不过多的赘述了。

  以下是我前段时间设计的权限管理系统的类关系图,只完成了部分的设计,还有个别部分没有加上, 是使用PowerDesigner 15设计的,由于这段时间非常的忙,没有继续完成剩下的功能。如果以后有时间,我会完成剩下的设计,然后重新上传。

  权限管理系统类关系图?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
跟我一起学习ASP.NET 4.5 MVC4.0(一)
原文 : http://www.cnblogs.com/xdotnet/archive/2012/03/05/aspnet_mvc40_preview.html ? 由于上面一个项目使用的是ASP.NET4.0 MVC3.0,在招人的时候发现很多人有听说过MVC,但是却是没用过,对MVC也只是一知半解,最近想给团队成员做一个系统的解说,让大家都可以学习一 下ASP.NET MVC3.0。
1076 0
跟我一起学习ASP.NET 4.5 MVC4.0(二)
原文http://www.cnblogs.com/xdotnet/archive/2012/03/06/aspnet_mvc40_keywords.html 上一篇文章中(跟我一起学习ASP.NET 4.5 MVC4.0(一)) 我们基础的了解了一下ASP.NET MVC4.0的一些比较简单的改变,主要是想对于MVC3.0来说的。
961 0
跟我一起学习ASP.NET 4.5 MVC4.0(三)
原文 http://www.cnblogs.com/xdotnet/archive/2012/03/07/aspnet_mvc40_validate.html 今天我们继续ASP.NET 4.5 MVC 4.0,前两天熟悉了MVC4.0在VS11和win8下的更新,以及MVC中的基础语法和几个关键字的使用。
921 0
跟我一起学习ASP.NET 4.5 MVC4.0(四)
原文http://www.cnblogs.com/xdotnet/archive/2012/03/27/aspnet_mvc4_authorize.html 前几个文章中介绍了一些关于MVC4.0的东东,今天我们来看一下登陆验证,也可以说是 权限验证,即AuthorizeAttribute。
852 0
跟我一起学习ASP.NET 4.5 MVC4.0(五)
原文http://www.cnblogs.com/xdotnet/archive/2012/03/29/aspnet_mvc4_html_control_checkboxlist.html 前面几篇文章介绍了一下ASP.NET MVC中的一些基础,今天我们一起来学习一下在ASP.NET MVC中控件的封装。
884 0
跟我一起学习ASP.NET 4.5 MVC4.0(六)
原文http://www.cnblogs.com/xdotnet/archive/2012/07/21/aspnet40_webpage20.html 这一系列文章跨度有点大,由于最近忙于其他事情,没有更新,今天重新安装了下Win8系 统,VS2012和SQLServer 2012,顺便抽空继续一篇。
968 0
+关注
狼人2007
个人对技术的追求:代码少而精捍;思路清晰美观;可扩展好维护;技术驱动商业; 人生格言:只要你有信念,有追求,并且坚持,那你一定比随波逐流,行得远行得正...
3522
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载
http://www.vxiaotou.com