大家久等了。

本篇专题主要讲述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权限的更多相关文章

  1. MVC5+EF6 入门完整教程13 -- 动态生成多级菜单

    稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...

  2. MVC5 + EF6 入门完整教程二

    从前端的UI开始 MVC分离的比较好,开发顺序没有特别要求,先开发哪一部分都可以,这次我们主要讲解前端UI的部分. ASP.NET MVC抛弃了WebForm的一些特有的习惯,例如服务器端控件,Vie ...

  3. MVC5 + EF6 入门完整教程1

    https://www.cnblogs.com/miro/p/4030622.html 第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定& ...

  4. MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用

    摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...

  5. MVC5 + EF6 入门完整教程(转载)--01

    MVC5 + EF6 入门完整教程   第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定". 直接讲这些 "约定&qu ...

  6. MVC5+EF6 入门完整教程

    MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@20150521 MVC5+EF6 入门完整教程9:多表 ...

  7. MVC5+EF6 入门完整教程九

    前一阵子临时有事,这篇文章发布间隔比较长,我们先回顾下之前的内容,每篇文章用一句话总结重点. 文章一 MVC核心概念简介,一个基本MVC项目结构 文章二 通过开发一个最基本的登录界面,介绍了如何从Co ...

  8. MVC5+EF6 入门完整教程 总目录

    本系列文章会从一个主干开始,逐渐深入,初步规划30篇.初级10篇,中级10篇,综合项目实战10篇 初级10篇 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@201505 ...

  9. MVC5 + EF6 入门完整教程 (1)

    第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定". 直接讲这些 "约定" 会让人困惑,而且东西太多容易忘记 ...

随机推荐

  1. 在线PDF编辑网站http://www.pdfescape.com

    网站地址:http://www.pdfescape.com 先转载一个简单介绍的文章 如果你以前很少阅读PDF文档,电脑中也没有PDF阅读器:adobe reader,foxit reader之类的软 ...

  2. CSS基础(三):选择器

    常用选择器 元素选择器,即html标记如div,ul,li,p,h1~h6,table等. p { font-size:14px; } h1 { color:#F00; } 复合选择器, 由两个选择器 ...

  3. 转 如何理解 重要性采样(importance sampling)

    分类: 我叫学术帖2011-03-25 13:22 3232人阅读 评论(4) 收藏 举报 图形 重要性采样是非常有意 思的一个方法.我们首先需要明确,这个方法是基于采样的,也就是基于所谓的蒙特卡洛法 ...

  4. 删除数据库数据,自增id清理

    方法一:Delete Form 表名 方法二:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 D ...

  5. 再谈LRU双链表内存管理

    N年前我写了个双链表也发了博客,还添了代码.但是那个代码不但复杂,而且还有有问题的,一直懒得整理,放在空间误导别人.最近在写服务端,今天抽点空补一篇. 关于LRU网上随便搜,有过后端经验的人应该很多都 ...

  6. CLR via C#深解笔记一 - CLR & C# 基础概念

    写在前言   .Net Framework并不是Win 32 API 和COM上的一个抽象层.   某种程度上,它是自己的操作系统,有自己的内存管理器,自己的安全系统,自己的文件加载器,自己的错误处理 ...

  7. 实战:ajax带参数请求slim API

    restful api 支持get,post,put,delete等方法,那么jquery客户端怎么去实现呢?涉及到跨域又怎么办? 很多时候需要传递一个token(api_key) 去识别用户身份,获 ...

  8. Web API 入门系列 - RESTful API 设计指南

    参考:https://developer.github.com/v3/  https://github.com/bolasblack/http-api-guide HTTP 协议 目前使用HTTP1. ...

  9. windbg加载sos.dll

    SOS.dll 中提供的 Son of Strike 扩展 (SOS),用于调试 WinDbg 中的托管代码.在启动了调试程序并将其附加到托管进程(或加载故障转储) .load C:\Windows\ ...

  10. Into concurrent LRU caching once again

    But this time, with a more product oriented point of view, instead of researching. http://openmymind ...