基于MVC的web项目最好的权限控制方式我认为是对Action的控制,实现思路记录于此,权限管理分成两个部分授权、认证。

一、授权

  1、读取当前项目中的所有需要控制的Action

        /// <summary>
/// 获取当前程序集内的所有Action
/// </summary>
/// <returns>当前程序集内的所有Action</returns>
/// <remarks>author:lorne date:2016-01-13</remarks>
public List<ActionInfo> GetAllAction()
{
var actions = new List<ActionInfo>();
var assembly = Assembly.GetExecutingAssembly();//获取当前程序集 #region 读取XML获取Action说明
Dictionary<string, string> notes = new Dictionary<string, string>();
try
{
//读取程序集的XML文件
var doc = new XmlDocument();
doc.Load(Server.MapPath(string.Format("~/bin/{0}.xml", assembly.FullName.Substring(, assembly.FullName.IndexOf(",")))));
var membersInfo = doc.FirstChild["members"]; JArray members = (JArray)JsonConvert.DeserializeObject<JObject>(JsonConvert.SerializeXmlNode(doc.LastChild["members"]))["members"]["member"];
foreach (var item in members)
{
//以key-value形式存储
notes.Add(item.Value<string>("@name"), item.Value<string>("summary").Trim());
}
}
catch (Exception)
{
}
#endregion foreach (var type in assembly.GetTypes())
{
if (type.BaseType == typeof(Controller))//取出Controller
{
var methods = type.GetMethods();
foreach (var method in methods)
{
if (method.ReturnType == typeof(ActionResult) || (method.ReturnType.BaseType != null && method.ReturnType.BaseType == typeof(ActionResult)))//取出Action
{
//允许匿名访问的不计入
if (method.GetCustomAttributes(typeof(AllowAnonymousAttribute)).Count() == )
{
var info = new ActionInfo(); info.Action = method.Name;
info.ActionDesc = notes.ContainsKey(string.Format("M:{0}.{1}.{2}", type.Namespace, type.Name, method.Name)) ? notes[string.Format("M:{0}.{1}.{2}", type.Namespace, type.Name, method.Name)] : "";
info.Controller = type.FullName;
info.ControllerDesc = notes.ContainsKey(string.Format("T:{0}.{1}", type.Namespace, type.Name)) ? notes[string.Format("T:{0}.{1}", type.Namespace, type.Name)] : ""; actions.Add(info);
}
}
}
}
}
return actions;
}

  2、保存授权设置,这个没有具体的实现,应该不会有太大的难度

二、认证

  1、使用过滤器(继承ActionFilterAttribute)处理Action请求,重写OnActionExecuting

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//获取当前用户所拥有的权限
List<ActionInfo> right = new List<ActionInfo>() { new ActionInfo() { Action = "A1", Controller = "RBAC.Controllers.AController" }, new ActionInfo() { Action = "A2", Controller = "RBAC.Controllers.AController" } }; //白名单
var whiteAction = GetWhiteAction(); //获取用户要请求的页面
ActionInfo context = new ActionInfo() { Action = filterContext.ActionDescriptor.ActionName, Controller = filterContext.Controller.ToString() }; //判断是否有权访问
if (!(whiteAction.Any(r => r.Action.Equals(context.Action, StringComparison.CurrentCultureIgnoreCase) && r.Controller.Equals(context.Controller, StringComparison.CurrentCultureIgnoreCase)) || right.Any(r => r.Action.Equals(context.Action, StringComparison.CurrentCultureIgnoreCase) && r.Controller.Equals(context.Controller, StringComparison.CurrentCultureIgnoreCase))))
{
filterContext.HttpContext.Response.Redirect("/Main/Msg");
}
}

  2、在 Global中注册过滤器

     GlobalFilters.Filters.Add(new AuthFilter());

  3、给一些不需要授权的Action加上特性[AllowAnonymous],当然也可以自定义其他的特性

        [AllowAnonymous]
public ActionResult Msg()
{
return View();
}

  由此基本完成,也可以下载源码参考下

朴素的标题:MVC中权限管理实践的更多相关文章

  1. MVC中权限管理

    权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少.权限管理几乎出现在任何系统里面,只要有用户和密码的系统.权限管理还是比较复杂的,有的固定到某个模 ...

  2. MVC之权限管理-网站开发之路

    一.前言 刚到公司没多长时间就开始接触MVC到现在不能说懂了,只能说到达会用这个层次吧,感觉MVC用来写Web还是很强大的,层次清晰. 今天我来写写关于权限管理这一块,自我感觉网站的权限主要分为菜单权 ...

  3. asp.net mvc的权限管理设计

    现在集中展示用户-角色-权限管理的功能,因此,所有数据表一律简化处理.   1 后台管理效果 (1)角色管理 (2)权限管理   2 数据库设计(MSSQL) (1)用户表dbo.Users 项 类型 ...

  4. MVC中权限的知识点及具体实现代码

    一:知识点部分 权限是做网页经常要涉及到的一个知识点,在使用MVC做权限设计时需要先了解以下知识: MVC中Url的执行是按照Controller->Action->View页面,但是我们 ...

  5. 在ASP.NET MVC中使用Knockout实践01,绑定Json对象

    本篇体验在ASP.NET MVC下使用Knockout,将使用EF Code First创建数据库.最后让Knockout绑定一个Json对象. 创建一个领域模型. namespace MvcAppl ...

  6. kubernetes API Server 权限管理实践

    API Server权限控制方式介绍 API Server权限控制分为三种:Authentication(身份认证).Authorization(授权).AdmissionControl(准入控制). ...

  7. ASP.NET MVC中权限控制的简单实现

    1.重写AuthorizeAttribute类,用自己的权限控制逻辑重写AuthorizeCore方法 public class MyAuthorizeAttribute : AuthorizeAtt ...

  8. Linux中权限管理之文件属性权限

    chattr [+-=][选项] 文件或目录名 + 增加权限 - 删除权限 = 等于某权限 选项: i 文件设置i属性,不允许对文件进行删除.改名.添加.修改数据,相当于把整个文件锁起来了 目录设置i ...

  9. Linux中权限管理之文件特殊权限

    SetUID 1.只有在可执行的二进制程序上设定SUID权限才是有意义的 2.命令执行者要对该程序拥有执行权限 3.命令执行者在执行该程序时获得该程序文件属主的身份 4.SetUID权限只在该程序执行 ...

随机推荐

  1. python读取excel学习(1)

    #coding=gbk #coding=utf-8 import xlrd table = xlrd.open_workbook(r'E:\test.xlsx') #sheet = table.she ...

  2. Postman插件如何安装

    我们chrome插件网热门推荐的软件之一就是postman.但是postman的适应平台分为:postman chrome应用程序,postman应用程序,postman插件.谷歌应用商店从2018年 ...

  3. Python中的函数(2)

    一.实参和形参        def greet_user(username): """显示简单的问候语,且显示用户名""" print(& ...

  4. python中的函数的分类

    函数的种类 传参的基本要求 默认参数 *args 关键字参数 **kwargs 普通函数 带参数 默认参数 def text(a,b=2) print("haha") print( ...

  5. LeetCode(11) Container With Most Water

    题目 Given n non-negative integers a1, a2, -, an, where each represents a point at coordinate (i, ai). ...

  6. 基于 NodeJs 打造 Web 在线聊天室

    Socket.IO 简介与基础环境搭建 任务时间:10min ~ 20min 关于 Socket.IO Socket.IO 可以实现在浏览器和服务器之间实时双向通信,本节课程将详细介绍 Socket. ...

  7. 活动预告丨易盾CTO朱浩齐将出席2018 AIIA大会,分享《人工智能在内容安全的应用实践》

    本文来自网易云社区 对于很多人来讲,仿佛昨天才燃起来的人工智能之火,转眼间烧遍了各个角落,如今我们的生活中,处处渗透着人工智能.10月16日,2018年 AIIA人工智能开发者大会在苏州举办,网易云易 ...

  8. JS替换回车换行符

    replace(/\r/ig, '<br>').replace(/\n/ig, '<br>')

  9. ZOJ 2588 求割边问题

    题目链接:http://vjudge.net/problem/viewProblem.action?id=14877 题目大意: 要尽可能多的烧毁桥,另外还要保证图的连通性,问哪些桥是绝对不能烧毁的 ...

  10. hdu4405:Aeroplane chess

    题目大意:有编号为0-n的格子,从0开始,扔骰子扔到几就走几格.有m个瞬移点,每个点可以从格x直接飞到格y,若瞬移到另一个瞬移点可以继续瞬移.求到达格n的期望扔骰子次数. 题解:期望DP入门好题.网上 ...