C# asp.net MVC 权限设计(续)

因为是转载文章 在此标明出处,以前有文章是转的没标明的请谅解,因为有些已经无法找到出处,或者与其它原因。

如有冒犯请联系本人,或删除,或标明出处。

因为好的文章,以前只想收藏,但连接有时候会失效,所以现在碰到好的直接转到自己这里。

原文 出处http://www.cnblogs.com/xiaoqi/archive/2011/01/24/1942880.html


asp.net MVC 权限设计一文中没有demo放出来,应大家的要求,这里补充上文并放出demo。

 

几点说明:

 

    1、基于将角色与controller、action相关联来判断用户是否有权

    2、通过自定义AuthorizeAttribute实现

    3、demo 仅供参考,一些规则可以根据实际情况重新定义

 

简明需求

1、可以对每个action实现权限控制,并且可以在数据库动态配置

2、权限分为允许所有人访问、允许注册用户访问、允许\禁止特定角色人访问

 

数据库设计

image

 

在demo里不使用数据库,这里给出表对应的类

核心流程

image

 

我们见一个Database类来模拟数据库

来看我们的主要代码

   /// <summary>
/// 自定义AuthorizeAttribute
/// </summary>
public  class  UserAuthorizeAttribute : AuthorizeAttribute
{
 
     public  override  void  OnAuthorization(AuthorizationContext filterContext)
     {
         var  user = filterContext.HttpContext.Session[ "CurrentUser" ] as  User;
 
         // 用户为空,赋予Guest
         if  (user == null )
         {
             user = Database.Users.Find(u => u.Name == "Guest" );
         }
 
         var  controller = filterContext.RouteData.Values[ "controller" ].ToString();
         var  action = filterContext.RouteData.Values[ "action" ].ToString();
         var  isAllowed = this .IsAllowed(user, controller, action);
 
         if  (!isAllowed)
         {
             filterContext.RequestContext.HttpContext.Response.Write( "无权访问" );
             filterContext.RequestContext.HttpContext.Response.End();
         }
 
     }
 
     /// <summary>
     /// 判断是否允许访问
     /// </summary>
     /// <span name="user"> </span>用户
     /// <span name="controller"> </span>控制器
     /// <span name="action"> </span>action
     /// <returns>是否允许访问</returns>
     public  bool  IsAllowed(User user, string  controller, string  action)
     {
 
         // 找controllerAction
         var  controllerAction = Database.ControllerActions.Find(ca => ca.IsController == false  && ca.Name == action && ca.ControllName == controller);
 
         //action无记录,找controller
         if  (controllerAction == null )
         {
             controllerAction = Database.ControllerActions.Find(ca => ca.IsController && ca.Name == controller);
         }
 
         // 无规则
         if  (controllerAction == null )
         {
             return  true ;
         }
 
 
         // 允许没有角色的:也就是说允许所有人,包括没有登录的用户
         if  (controllerAction.IsAllowedNoneRoles)
         {
             return  true ;
         }
 
         // 允许所有角色:只要有角色,就可以访问
         if  (controllerAction.IsAllowedAllRoles)
         {
             var  roles = Database.UserRoles.FindAll(ur => ur.UserId == user.Id);
             if  (roles.Count > 0)
             {
                 return  true ;
             }
             else
             {
                 return  false ;
             }
         }
 
 
         // 选出action对应的角色
         var  actionRoles = Database.ControllerActionRoles.FindAll(ca => ca.ControllerActioId == controllerAction.Id).ToList();
 
         if  (actionRoles.Count == 0)
         {
             // 角色数量为0,也就是说没有定义访问规则,默认允许访问
             return  true ;
         }
 
         var  userHavedRolesids = Database.UserRoles.FindAll(ur => ur.UserId == user.Id).Select(ca => ca.RoleId).ToList();
 
         // 查找禁止的角色
         var  notAllowedRoles = actionRoles.FindAll(r => !r.IsAllowed).Select(ca => ca.RoleId).ToList();
         if  (notAllowedRoles.Count > 0)
         {
             foreach  ( int  roleId in  notAllowedRoles)
             {
                 // 用户的角色在禁止访问列表中,不允许访问
                 if  (userHavedRolesids.Contains(roleId))
                 {
                     return  false ;
                 }
             }
         }
 
         // 查找允许访问的角色列表
         var  allowRoles = actionRoles.FindAll(r => r.IsAllowed).Select(ca => ca.RoleId).ToList();
         if  (allowRoles.Count > 0)
         {
             foreach  ( int  roleId in  allowRoles)
             {
                 // 用户的角色在访问的角色列表
                 if  (userHavedRolesids.Contains(roleId))
                 {
                     return  true ;
                 }
             }
         }
 
         // 默认禁止访问
         return  false ;
     }
 
}

测试

[HandleError]
[UserAuthorize]
public  class  HomeController : Controller
{
     public  ActionResult Index()
     {
         ViewData[ "Message" ] = "欢迎使用 ASP.NET MVC!" ;
 
         return  View();
     }
     public  ActionResult Admin()
     {
         ViewData[ "Message" ] = "只有管理员才能访问!" ;
 
         return  View( "Index" );
     }
     public  ActionResult User()
     {
         ViewData[ "Message" ] = "只要是注册用户就能访问!" ;
 
         return  View( "Index" );
     }
     public  ActionResult UserOnly()
     {
         ViewData[ "Message" ] = "只能是User才能能访问!" ;
 
         return  View( "Index" );
     }
 
     public  ActionResult Login( string  user)
     {
         Session[ "CurrentUser" ] = Database.Users.Find(u => u.Name == user);
         if  (Session[ "CurrentUser" ] != null )
         {
             ViewData[ "Message" ] = "你已登录为"  + user;
         }
 
         return  View( "Index" );
     }
 
 
     public  ActionResult About()
     {
         return  View();
     }
}

 

1、登录为Admin

image

 

访问Admin

image

 

访问User

image

 

访问UserOnly

image

 

2、登录为User

image

 

访问Admin

image

 

访问User

image

访问UserOnly

image

 

demo下载 MVCRole.rar


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ASP.NET MVC是一种用于构建Web应用程序的开发框架,它使用C#作为主要的编程语言。ASP.NET MVC是微软公司推出的一种模型-视图-控制器(Model-View-Controller)架构模式的实现。 在ASP.NET MVC中,开发人员将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。模型是应用程序的数据层,用于处理数据逻辑和持久化数据。视图是应用程序的用户界面,用于渲染数据并向用户显示信息。控制器负责接收用户请求,并根据请求调用适当的模型和视图,并对用户请求进行处理和响应。 ASP.NET MVC具有很多优点。首先,它提供了良好的可维护性和可测试性,因为它将应用程序分为独立的组件。这使得开发人员可以轻松地对每个组件进行测试和修改,而不会对其他组件产生影响。其次,ASP.NET MVC具有丰富的功能和灵活的扩展性,开发人员可以根据项目需求自定义和扩展框架。此外,ASP.NET MVC具有良好的性能和安全性,可以处理大量并发请求,并防止网络攻击。 为了使用ASP.NET MVC进行开发,开发人员需要具备一定的C#编程知识。C#是一种面向对象的编程语言,与ASP.NET MVC紧密集成。开发人员可以使用C#编写模型、控制器和视图,并使用C#提供的丰富的类库和框架来处理数据和逻辑。C#还具有强类型和类型安全性,可以提高代码的可靠性和性能。 总而言之,ASP.NET MVC是一个强大且灵活的Web开发框架,其结合了C#编程语言和模型-视图-控制器架构模式。它提供了可维护、可测试、高性能和安全的解决方案,适用于构建各种规模的Web应用程序。 ### 回答2: ASP.NET MVC(Model-View-Controller)是一种Web应用程序开发模式,通过将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller),帮助开发人员更好地分离关注点和组织代码。 模型(Model)是应用程序的核心组件,它负责处理应用程序的数据逻辑和业务逻辑。模型通常是与数据库或其他数据存储互动的组件,它负责数据的获取、处理和存储。模型可以包含实体类、数据访问层和业务逻辑处理。 视图(View)负责呈现应用程序的用户界面,它是用户与应用程序交互的地方。视图通常是由HTML和其他前端技术组成,开发者可以使用视图模板语言来动态渲染数据。视图的主要职责是显示模型中的数据,并为用户提供交互操作的界面。 控制器(Controller)负责处理用户请求和控制应用程序的流程。它接收来自用户的请求,根据请求的类型和数据,调用适当的模型进行数据处理和业务逻辑处理,最后将数据传递给视图进行展示。控制器在MVC模式中扮演了协调器的角色,它负责将用户输入映射到模型和视图之间。 ASP.NET MVC为开发人员提供了一种清晰的结构和良好的组织方式,可以更好地管理应用程序的代码和资源。使用ASP.NET MVC,开发人员可以轻松实现URL路由、权限控制、数据校验和错误处理等功能。同时,ASP.NET MVC还提供了可扩展的机制和工具,使开发人员能够定制和优化应用程序的性能和功能。 总之,ASP.NET MVC是一种优秀的Web应用程序开发框架,它通过模型-视图-控制器的设计模式,使开发人员能够更好地组织和管理代码,提高应用程序的开发效率和质量。 ### 回答3: ASP.NET MVC是一种基于MVC(Model-View-Controller)架构的Web应用程序开发框架。它结合了传统Web Forms和ASP.NET的特点,提供了一种更加灵活和可控的开发模式。 ASP.NET MVC采用了分层的开发模式,其中Model层用于处理数据的操作,View层用于展示数据,并处理用户的输入和界面交互,Controller层用于处理业务逻辑和协调Model和View之间的交互。这种分层使得各个部分的职责清晰明确,提高了代码的可维护性和可测试性。 在ASP.NET MVC中,控制器负责接收用户的请求,并根据请求的内容决定要执行哪些操作,或者调用适当的Model来处理数据。然后,控制器将处理的结果传递给View层进行展示。通过这种方式,控制器起到了桥接Model和View的作用。 ASP.NET MVC还提供了强大的路由功能,通过路由表将URL映射到对应的控制器和操作上,使得开发者可以更加灵活地定义URL和页面之间的关系。 除了以上的特点,ASP.NET MVC还具有以下优点: 1. 更加灵活:通过MVC的模式,开发者可以根据自己的需求灵活地选择使用哪些组件和功能,没有多余的开销。 2. 可测试性:因为MVC将应用程序分成了独立的组件,所以每个组件都可以独立地进行测试,提高了代码的质量和稳定性。 3. 简化开发过程:ASP.NET MVC提供了很多通用的功能和组件,例如表单验证、身份验证和数据绑定等,这些可以帮助开发者快速构建应用程序。 4. 跨平台支持:ASP.NET MVC可以运行在Windows和Linux等多个平台上,为开发者提供了更多的选择。 总之,ASP.NET MVC是一个功能强大、灵活和可扩展的Web开发框架,它可以帮助开发者快速构建高质量的Web应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值