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

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

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

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

 

几点说明:

 

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

    2、通过自定义AuthorizeAttribute实现

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

 

简明需求

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

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

 

数据库设计

C# asp.net MVC 权限设计(续)_数据库

 

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


+ View Code


核心流程

C# asp.net MVC 权限设计(续)_数据库_02

 

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


+ View Code


来看我们的主要代码



/// <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

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

 

访问Admin

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

 

访问User

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

 

访问UserOnly

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

 

2、登录为User

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

 

访问Admin

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

 

访问User

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

访问UserOnly

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

 

demo下载 MVCRole.rar