MVC5+EF6 入门完整教程12--灵活控制Action权限
大家久等了。
本篇专题主要讲述MVC中的权限方案。
权限控制是每个系统都必须解决的问题,也是园子里讨论最多的专题之一。
前面的系列文章中我们用到了 SysUser, SysRole, SysUserRole 这几个示例表。
我们以此为基础,完成RBAC (基于角色的控制) 的核心功能。
在此给出我的最佳实践,最终的效果是针对任意一个Action或Controller,都可以根据配置的角色来控制访问权限。
完成此核心功能后,可以再往两方面扩展常用功能:
1. 可以根据 组织/用户/角色 的并集来控制权限
2. 以此核心功能为基础,实现菜单的动态配置
本篇文章将会先完成核心功能,扩展部分的内容在后续文章中再讲。
文章提纲
- 概述要点
- 理论基础
- 详细步骤
- 总结
概述要点(知识点)
一、MVC Form认证身份基础
通常用法举例:
1. web.config à system.web配置节下,开启form认证

2. 需要认证的 Control或Action 上添加过滤,例如限制只有 Scott可以访问

还有其他两种常用形式,分别表示:
登录用户可以访问
[Authorize]
角色为Admin的用户可以访问
[Authorize(Roles = "Admin")]
过滤条件可以加在Action或整个Controller上。
二、MVC权限过滤器扩展
上述解决方式中很明显会发现有两个缺点:
1. 修改权限时需在Action, Controller上修改后需重新编译,不灵活。
2.过滤器中的Role是内置对象,如果不使用ASP.NET自身的集成权限方案,就无法按照角色来过滤。
解决这两个问题,只需要扩展类AuthorizeAttribute即可。

理论基础
为了能使用自定义的角色控制权限,我们需要扩展或绕过 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认证

2. 完成登录/退出 基本功能
新建Controller: AccountController
登录功能:



退出功能

对应的View(略,请直接查看源文件)
二、准备好权限配置文件
1. 用到的基础数据:用户,角色及用户/角色 关系

2. 角色与Action对应的权限关系
这里我们先用一个XML代替,后续最终项目完成时会统一到DB中。
新建文件夹Config,新建ActionRoles文件,配置Action/Role的对应关系

说明:
Action未配置情况下,默认有访问权限;
Action 配置角色为空,有访问权限。
三、扩展 AuthorizeAttribute
1. 新建类CustomAuthorizeAttribute,继承与AuthorizeAttribute
override两个方法:
a. 在请求授权时调用:

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

具体实现:




以上使用的GetActionRoles的实现:


总结
至此,权限控制的整个过程就OK了,我们来测试一下。
新建HomeController, 新建一些Action做测试(Index, About,Contact)
回顾一下基础数据。
Scott 角色为 General Users

XML配置为:

我们把整个HomeController 上都加上 [CustomAuthorize]
使用场景举例:
1. Index 配置为空,任何人都能访问

2. About 配置为Manager, Administrators, General Users 可以访问
未登录时跳转至登录界面


3. Contact配置为 Administrators可以访问
scott的角色为General Users, 不在权限表里,登录不进去此页面

另外补充说明:
如下图,可以设置为全局。
这样就不需要单个设置,对所有Action应用自定义过滤条件。

欢迎大家多多评论和支持,祝学习进步 :)
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--灵活控制Action权限的更多相关文章
- MVC5+EF6 入门完整教程13 -- 动态生成多级菜单
稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...
- MVC5 + EF6 入门完整教程二
从前端的UI开始 MVC分离的比较好,开发顺序没有特别要求,先开发哪一部分都可以,这次我们主要讲解前端UI的部分. ASP.NET MVC抛弃了WebForm的一些特有的习惯,例如服务器端控件,Vie ...
- MVC5 + EF6 入门完整教程1
https://www.cnblogs.com/miro/p/4030622.html 第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定& ...
- MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用
摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...
- MVC5 + EF6 入门完整教程(转载)--01
MVC5 + EF6 入门完整教程 第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定". 直接讲这些 "约定&qu ...
- MVC5+EF6 入门完整教程
MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@20150521 MVC5+EF6 入门完整教程9:多表 ...
- MVC5+EF6 入门完整教程九
前一阵子临时有事,这篇文章发布间隔比较长,我们先回顾下之前的内容,每篇文章用一句话总结重点. 文章一 MVC核心概念简介,一个基本MVC项目结构 文章二 通过开发一个最基本的登录界面,介绍了如何从Co ...
- MVC5+EF6 入门完整教程 总目录
本系列文章会从一个主干开始,逐渐深入,初步规划30篇.初级10篇,中级10篇,综合项目实战10篇 初级10篇 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@201505 ...
- MVC5 + EF6 入门完整教程 (1)
第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定". 直接讲这些 "约定" 会让人困惑,而且东西太多容易忘记 ...
随机推荐
- 前端开发者进阶之ECMAScript新特性【一】--Object.create
Object.create(prototype, descriptors) :创建一个具有指定原型且可选择性地包含指定属性的对象 参数:prototype 必需. 要用作原型的对象. 可以为 nul ...
- eclipse 启动后,闪退
网上的大部分是说删除 .metadata 说会workspace里面项目会消失 下面这个可以启动,项目还在 最好解决办法: 删除文件 [workspace]/.metadata/.plugins ...
- CSS-JQUERY笔记
Ready $(document).ready(function(){ }) Input_div_span Input-长度限制 <input maxLength="2"&g ...
- EETOP中关于Gm仿真的一些帖子的总结
1. cadence画gm曲线 电路里,要把漏的电源dc值设置成变量,比如叫vds,计算器,info标签,点op,然后点管子,在op窗口点list,选gm,然后把这个公式弄到ADE的outputs那里 ...
- node递归属性目录结构
要求,读取结束后才能输出所有文件 var fs = require('fs');var path = require('path'); var list = [];var count = 0;func ...
- 关于织梦系统不支持php中GD库的问题
大多数人在显成的PHP的CMS时,如织梦CMS,安装的时候不支持GD库,就导致整个网站的验证码不显示,以下是个人对此类问题的解决办法: 1.首先找到wamp的安装目录,找到PHP的文件夹,打开php. ...
- DMSFrame 之简单用法(一)
1.DMSFrame是一个完整的ORM框架,框架相对来说也比成熟了.使用上有些地方还是比较方便的.DLL文件大约300K左右,但却可以支持各种方式的查询,完全的LINQ化的方式书写代码,更有利于维护. ...
- 【软件分析与挖掘】Multiple kernel ensemble learning for software defect prediction
摘要: 利用软件中的历史缺陷数据来建立分类器,进行软件缺陷的检测. 多核学习(Multiple kernel learning):把历史缺陷数据映射到高维特征空间,使得数据能够更好地表达: 集成学习( ...
- java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单
一.widget:桌面小控件1 写一个类extends AppWidgetProvider 2 在清单文件件中注册: <receiver android:name=".ExampleA ...
- 《编写高质量代码:改善C#程序的157个建议》源码下载
==== 目录 前 言第一部分 语言篇第1章 基本语言要素 / 2建议1:正确操作字符串 / 2建议2:使用默认转型方法 / 6建议3:区别对待强制转型与as和is / 9建议4:TryParse比P ...