zoukankan      html  css  js  c++  java
  • [.Net MVC] 用户角色权限管理_使用CLK.AspNet.Identity

    项目:后台管理平台

    意义:一个完整的管理平台需要提供用户注册、登录等功能,以及认证和授权功能。


    一、为何使用CLK.AspNet.Identity

      首先简要说明所采取的权限控制方式。这里采用了基于角色的方式,基于角色的权限控制,就是将程序的操作按权限进行分组,每一个组对应一个角色,如果某个用户想访问某个操作,必须赋予这个用户相应的角色,换句话说,如果用户不属于这个操作所属的角色,这个用户也没有访问的权限。

      ASP.NET Identity是微软在MVC 5.0中引入的一种membership框架,由核心功能模块、EF模块以及OWIN模块等组成:

    •   Microsoft.AspNet.Identity.Core 库,包含Identity的主要功能;
    •   Microsoft.AspNet.Identity.EntityFramework库,主要包括ASP.NET Identity 的EF 部分的实现;
    •   Microsoft.AspNet.Identity.OWIN库,包括ASP.NET Identity对OWIN 的支持。

      在自己开发的程序中使用ASP.NET Identity后,可以定义用户属于哪个角色、哪个角色可以使用那些功能,用户通过验证之后,可以依照角色来使用系统功能。比如可以通过Authorization过滤器的AuthorizeAttribute属性来标记控制器的访问权限,对不同角色的用户提供不同的Contact操作或者视图。

    public class HomeController : Controller
    {
        [Authorize(Roles = "Admin")]
        public ActionResult Contact() { ... }
    
        [Authorize(Roles = "Guest")]
        public ActionResult Contact() { ... }
    }

    从上面的示例也发现了问题,ASP.NET Identity授权机制可以在系统运行中动态变更用户所属的角色,但是却不能动态变更角色可以使用的功能。这是因为在ASP.NET Identity里,使用者属于哪个角色的设定储存于数据库可以动态变更,而角色可以使用那些功能的设定则是定义在程序代码没有办法动态变更。

      而这里采用的CLK.AspNet.Identity授权机制可以弥补这个问题,使用CLK.AspNet.Identity可以继续使用继承自ASP.NET Identity的功能,并且还提供了以角色为基础的访问控制(Role-based access control, RBAC),将系统授权拆解为User(使用者)、Role(角色)、Permission(权限)。在程序中使用CLK.AspNet.Identity后,可以定义用户属于哪个角色、哪个角色拥有那些权限、权限可以使用哪些功能,后续用户通过验证之后,就可以依照角色权限来使用系统功能。按如下使用方式,

    public class HomeController : Controller
    {
        [RBACAuthorize(Permission = "AboutAccess")]
        public ActionResult About() { ... }
    
        [RBACAuthorize(Permission = "ContactAccess")]
        public ActionResult Contact() { ... }
    }

    可以看出,在程序中给控制器分配不同的权限,而用户所属的角色以及角色所拥有的权限是可以动态改变的。

    二、在项目中使用CLK.AspNet.Identity

      通过NuGet安装CLK.AspNet.Identity、CLK.AspNet.Identity.MVC、CLK.AspNet.Identity.EntityFramework三个库。

    然后在App_Start/IdentityConfig.cs和Models/IdentityModel.cs两个文件中添加身份验证有关的数据库上下文类、管理器类和对象实体类,这部分的代码可以参考CLK.AspNet.Identity.MVC Template的相应文件,要注意数据库的创建根据项目需要是新建还是在已有的数据库中添加表单,是否需要在程序初始化时由程序创建基本的用户、角色等信息,以及配置密码验证逻辑,锁定默认值等信息。

      在App_Start/Startup.Auth.cs中配置身份验证的详细信息,也可以参考CLK.AspNet.Identity.MVC Template的相应文件。

      最后创建RBACAuthorizeAttribute类,自定义的Authorization Filter,同样参考CLK.AspNet.Identity.MVC Template。

      程序运行中对用户角色权限的管理,需要相应的控制器和视图、视图模型,根据项目需要编写,主要是CRUD操作,给用户分配角色权限、给角色分配权限等操作。

    三、在视图、域中使用权限管理

      对视图中的某些内容设置角色权限,只对这个角色下的用户显示。

    if(User.IsInRole("Admin"))
    {
      <li>
        <a href="@Url.Action("Index", "CategoryType", new { area = "Admin" }, null)"> <i class="fa fa-cogs"> </i></a>
      </li>
    }

      对多个页面设置访问权限,可以在每个需要的控制器上添加权限属性,也可以在Web.config中,配置下面的节点,实现对指定文件或路径的权限设置。

    <location path="Admin">
      <system.web>
        <authorization>
          <allow roles="Admin"/>  <!--允许指定Admin角色用户可访问-->
          <deny users="*"/>    <!-- 禁止所有非指定访问用户的访问-->
        </authorization>
      </system.web>
    </location>

    参考资源

    http://www.cnblogs.com/Leo_wl/p/4564663.html

    http://www.cnblogs.com/chonghanyu/p/4090631.html

    http://www.cnblogs.com/chonghanyu/p/4344662.html

    关键字:.NET MVC,RBAC

    < 原创文章如转载,请注明出处。 />
  • 相关阅读:
    41、XAML text editing
    使用JavaScript和DOM动态创建和修改表格(转)
    ThinkPHP入门
    PHP字符串
    sicily 6773. 用指针交换两个矩阵
    sicily 6572. partial sum
    sicily 1934. 移动小球
    sicily 1323. Switch text
    sicily 6766. tmp
    sicily 1293. 3n+1数链问题
  • 原文地址:https://www.cnblogs.com/belloworld/p/4760670.html
Copyright © 2011-2022 走看看