你的位置:首页 > 软件开发 > ASP.net > MVC5+EF6 入门完整教程12

MVC5+EF6 入门完整教程12

发布时间:2016-05-04 09:00:10
大家久等了。 本篇专题主要讲述MVC中的权限方案。 权限控制是每个系统都必须解决的问题,也是园子里讨论最多的专题之一。 前面的系列文章中我们用到了 SysUser, SysRole, SysUserRole 这几个示例表。 我们以此为基础,完成RBAC (基于角色的控制) 的核心 ...

MVC5+EF6 入门完整教程12

大家久等了。

本篇专题主要讲述MVC中的权限方案。

权限控制是每个系统都必须解决的问题,也是园子里讨论最多的专题之一。

前面的系列文章中我们用到了 SysUser, SysRole, SysUserRole 这几个示例表。

我们以此为基础,完成RBAC (基于角色的控制) 的核心功能。

在此给出我的最佳实践,最终的效果是针对任意一个Action或Controller,都可以根据配置的角色来控制访问权限。

完成此核心功能后,可以再往两方面扩展常用功能:

1. 可以根据 组织/用户/角色 的并集来控制权限

2. 以此核心功能为基础,实现菜单的动态配置

 

本篇文章将会先完成核心功能,扩展部分的内容在后续文章中再讲。

 

文章提纲

  • 概述要点

     

     

     

     

    还有其他两种常用形式,分别表示:

    登录用户可以访问

    [Authorize]

    角色为Admin的用户可以访问

    [Authorize(Roles = "Admin")]

    过滤条件可以加在Action或整个Controller上。

     

    二、MVC权限过滤器扩展

    上述解决方式中很明显会发现有两个缺点:

    1. 修改权限时需在Action, Controller上修改后需重新编译,不灵活。

    2.过滤器中的Role是内置对象,如果不使用get='_blank'>ASP.NET自身的集成权限方案,就无法按照角色来过滤。

    解决这两个问题,只需要扩展类AuthorizeAttribute即可。

    MVC5+EF6 入门完整教程12

    理论基础

    为了能使用自定义的角色控制权限,我们需要扩展或绕过 ASP.NET 的Membership和Role provider 框架。

    1.扩展:实现自定义的 Membership/Role provider

    2.绕过:直接不使用

     

    我们选择绕过的方式,这样的话更加灵活。

    (因为如果你的角色结构和系统不一致,用扩展的方式弄起来比较麻烦)

    我们使用form认证的三个核心API, 只用这几个API既可以减少工作量,又可以和Membership/Role provider保持独立,鱼和熊掌兼得。

    1. FormsAuthentication.SetAuthCookie

    用户登录后,指定用户名

    2. Request.IsAuthenticated

    登录后返回true

    3. HttpContext.Current.User.Identity.Name

    返回登录的用户名

     

    权限过滤的完整过程:

    1. Authetication ( 登录 )

    登录成功后,调用 FormsAuthentication.SetAuthCookie 设置一个用户名。

    2. Authorization(授权)

    新建自定义的授权属性类:CustomAuthorizeAttribute(继承于AuthorizeAtrribute),扩展权限过滤器

    3. 类似于默认Authorize attribute的使用方法,附加自定义的authorize attribute到controller或action上去,实现权限过滤

     

    详细步骤

    下面是具体实现步骤。

    一、启用form认证,完成登录/退出 基本功能

    1. 启用 form 认证

    web.config à system.web配置节下,启用form认证

    MVC5+EF6 入门完整教程12

     

    2. 完成登录/退出 基本功能

    新建Controller: AccountController

    登录功能:

    MVC5+EF6 入门完整教程12

    MVC5+EF6 入门完整教程12

    MVC5+EF6 入门完整教程12

    退出功能

    MVC5+EF6 入门完整教程12

     

    对应的View(略,请直接查看源文件)

     

    二、准备好权限配置文件

    1. 用到的基础数据:用户,角色及用户/角色 关系

    MVC5+EF6 入门完整教程12

     

    2. 角色与Action对应的权限关系

    这里我们先用一个

    新建文件夹Config,新建ActionRoles文件,配置Action/Role的对应关系

    MVC5+EF6 入门完整教程12

    说明:

    Action未配置情况下,默认有访问权限;

    Action 配置角色为空,有访问权限。

     

    三、扩展 AuthorizeAttribute

    1. 新建类CustomAuthorizeAttribute,继承与AuthorizeAttribute

    override两个方法:

    a. 在请求授权时调用:

    MVC5+EF6 入门完整教程12

     

    b. 提供一个入口点用于自定义授权检查,通过为true

    MVC5+EF6 入门完整教程12

     

    具体实现:

    MVC5+EF6 入门完整教程12

    MVC5+EF6 入门完整教程12

    MVC5+EF6 入门完整教程12

    MVC5+EF6 入门完整教程12

     

    以上使用的GetActionRoles的实现:

    MVC5+EF6 入门完整教程12

    MVC5+EF6 入门完整教程12

     

    总结

    至此,权限控制的整个过程就OK了,我们来测试一下。

    新建HomeController, 新建一些Action做测试(Index, About,Contact)

    回顾一下基础数据。

     

    Scott 角色为 General Users

    MVC5+EF6 入门完整教程12

    MVC5+EF6 入门完整教程12

     

    我们把整个HomeController 上都加上 [CustomAuthorize]

    使用场景举例:

    1. Index 配置为空,任何人都能访问

    MVC5+EF6 入门完整教程12

     

    2. About 配置为Manager, Administrators, General Users 可以访问

    未登录时跳转至登录界面

    MVC5+EF6 入门完整教程12

     

    MVC5+EF6 入门完整教程12

     

    3. Contact配置为 Administrators可以访问

    scott的角色为General Users, 不在权限表里,登录不进去此页面

    MVC5+EF6 入门完整教程12

     

    另外补充说明:

    如下图,可以设置为全局。

    这样就不需要单个设置,对所有Action应用自定义过滤条件。

    MVC5+EF6 入门完整教程12

     

    欢迎大家多多评论和支持,祝学习进步 :)

     

     

     

    PS.

    另外公司研发部招聘工程师2名(R语言方向 & .NET开发方向),主要研发数据可视化相关新产品,有兴趣的可以博客园短消息联系我。

    base 在苏州高新区

    完整目录:

      • MVC5+EF6 入门完整教程12--灵活控制Action权限 @20160504
      • MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用 @20150914
      • MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@20150521
      • MVC5+EF6 入门完整教程9:多表数据加载@20150212
      • MVC5+EF6 入门完整教程8 :不丢失数据进行数据库结构升级 @20141215
      • MVC5+EF6 入门完整教程7 :排序过滤分页 @20141201
      • MVC5+EF6 入门完整教程6 :分部视图(Partial View) @20141117
      • MVC5+EF6 入门完整教程5 :UI的一些改造 @20141113
      • MVC5+EF6 入门完整教程4 :EF基本的CRUD @20141104
      • MVC5+EF6 入门完整教程3 :EF完整开发流程 @20141027
      • MVC5+EF6 入门完整教程2 :从前端UI开始 @20141021
      • MVC5+EF6 入门完整教程1 :从0开始

    原标题:MVC5+EF6 入门完整教程12

    关键词:mvc

mvc
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。