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

  以前一位同事习惯于使用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设计的,由于这段时间非常的忙,没有继续完成剩下的功能。如果以后有时间,我会完成剩下的设计,然后重新上传。

  权限管理系统类关系图 

时间: 2024-10-29 11:04:34

一起谈.NET技术,ASP.NET MVC Membership 权限 漫谈的相关文章

技术-现在手上有一个asp.net mvc通用权限管理框架,想交换其它.net快速开发框架。

问题描述 现在手上有一个asp.net mvc通用权限管理框架,想交换其它.net快速开发框架. 主要用来学习这方面的技术,提升自己的水平.扩展自己的知识面.扣扣:八七八零壹壹八四六 解决方案 www.51aspx.com 这里找找看 解决方案二: 这种框架,你在google里面搜索 site:download.csdn.net .net 开发框架 能找出千千万万.但是我从来没有听说过有人用这些垃圾代码能"提升水平"的.

一起谈.NET技术,一个MVC分页Helper

本人写的一个分页Helper,支持普通分页(也就是,首页.上一页.下一页.末页等),综合分页(普通分页和数字分页的综合).下面是分页效果: 分页代码: PagerHelper.cs 代码   1 using System;  2  using System.Collections.Generic;  3 using System.Collections.Specialized;  4 using System.Linq;  5 using System.Web;  6 using System.

一个基于Asp.Net MVC的权限方案_实用技巧

1.数据结构Mad_Popedom为权限表,Control记录控制器名,Action记录动作名.Mad_Role为角色表. 2.权限控制的实现此处使用比较简单AOP方式,用MVC的Filter实现,代码如下 复制代码 代码如下: using System.Collections.Generic; using System.Web.Mvc; using Madnet.Model.MadAdmin; using Madnet.BLL.MadAdmin; namespace Madnet.Contro

asp.net MVC AuthorizeAttribute 权限验证问题

问题描述 为什么上面的代码执行完毕后user登录状态还是没登录呢Name还是空登录状态还是FALSE是代码错了吗//FormsAuthenticationTicketauthTicket=newFormsAuthenticationTicket(//1,//"userID=5",//DateTime.Now,//DateTime.Now.AddMinutes(20),//false,//"admin"//写入用户角色//);//stringencryptedTick

一起谈.NET技术,ASP.NET MVC 2中使用jQuery UI控件详解

问:我想给我的ASP.NET MVC输入表单添加一个日期选择控件,但模型-视图-控制器(MVC)并没有提供这样的辅助方法,我该如何添加控件? 答:和ASP.NET Web表单不一样,MVC架构没有提供可以在设计面板中拖放的有状态的服务端控件,相反,MVC鼓励使用简单的HTML布局元素和基于数据的标签作为页面布局的要素,功能和最终的布局用客户端JavaScript和CSS样式表控制. MVC提供了一套基于HtmlHelper的扩展方法渲染大部分HTML标签,对于更复杂的功能,你需要自己编写HTML

一起谈.NET技术,[翻译]ASP.NET MVC 3 RC 发布通告

今天早上,ASP.NET组发布了ASP.NET 3 RC版(release candidate).你们可以从这里进行下载here. ASP.NET MVC 3是个很完美的发布,增加了大量的功能改进.它可以向后兼容ASP.NET MVC V1 和 V2,可以轻易的升级你现有的项目(可以阅读发布须知,根据里面的步骤去做).你还可以通过我之前发表的博客文章来学习ASP.NET MVC 3的很多功能.  今天的ASP.NET MVC 3 RC build 包含了一些附加的功能改进(除了修正了一些bug外

一起谈.NET技术,ASP.NET MVC 2生成动态表单的一种最简单的思路

在BPM.OA等系统中,都会存在一个表单设计器.有些是通过操作gridview来完成一个表单的设计:有些是通过类似VS拖拽的方法完成一个表单的设计.很明显后面一种优越于前面一种.无论是哪种,最后都会产生一些XML之类的表单结构的数据. 这篇文章将讲述,在表单设计器设计好表单之后,在ASP.NET MVC中如何将表单结构的xml转换成实际应用系统中的表单.看下面一个xml文件,我们假设它是由一个表单设计器设计出来的. <?xml version="1.0" encoding=&qu

一起谈.NET技术,重构TekPub——从ASP.NET MVC框架迁移到Ruby on Rails

TekPub是一个面向开发人员的站点,致力于为开发人员提供一系列主题的在线培训,主题范围非常广泛,从微软的O/R Mapping框架Microsoft Entity Framework,到如何使用Ruby on Rails技术编写自己的日志引擎等内容都有涉及.该网站是由前微软员工Rob Conery与Lounge的老板James Avery创立的. TekPub是个很有趣的学习案例,公司开始时使用ASP.NET MVC框架,之后很快迁移到了Ruby on Rails上.InfoQ与Rob和Jam

一起谈.NET技术,鲜为人知的ASP.NET MVC 2.0框架高效之谜

要想建立开发环境,你需要安装Visual Studio 2008/2010 Beta 2,以及SQL Express 2005(可免费从MSDN下载)和MVC 2.0框架.我把本文中的示例Web应用命名为"Employee Master Information". 使用该应用程序,你可以输入新员工数据,编辑现有员工数据,可以查看特定员工数据,和从数据库中给删除任意员工信息.该应用程序还使用了ASP.NET的Membership Provider来创建新用户和认证已有用户,客户端验证通过