MVC AuthorizeAttribute 动态授权
开发中经常会遇到权限功能的设计,而在MVC 下我们便可以使用重写 AuthorizeAttribute 类来实现自定义的权限认证
首先我们的了解 AuthorizeAttribute 下面3个主要的方法
AuthorizeCore,HandleUnauthorizedRequest,OnAuthorization
一般情况下我们不需要去重 OnAuthorization 方法
主要是 AuthorizeCore,HandleUnauthorizedRequest 两个方法
HandleUnauthorizedRequest 是用来响应认证失败后的处理
AuthorizeCore 方法则是授权方法
由于我是用OWIN 去认证的 所以只需要重写AuthorizeCore 方法
创建一个接口 具体作用后面会说到
interface IAuthorize { }
模块实体信息,用于存放一些模块附加信息,为选择权限页面提供数据
public class ModuleEntity
{
private Type _type; private MyModuleAttribute _m;
public MyModuleAttribute Module { get{return this._m;} }
List<AuthorizeEntity> _authorizes;
private ModuleEntity() { }
public static ModuleEntity Create(MyModuleAttribute m, Type type)
{
ModuleEntity model = new ModuleEntity();
model._type = type;
model._m = m;
return model;
}
public static void IterateAction( ModuleEntity entity)
{
//反射模块下的所有权限信息
}
}
操作枚举表示需要授权方法的行为
public enum AuthorizeAction : uint
{
Empty=0,
List = 1,
Look = 2,
Add = 3,
Editor = 4,
Delete = 5,
}
权限实体信息 同模块实体信息一样 为权限页面提供数据
public class AuthorizeEntity
{
private AuthorizeAction _action;
private string _name;
public AuthorizeAction Action { get { return this._action; } }
public string Name { get { return this._name; } }
public AuthorizeEntity(AuthorizeAction a, string name)
{
this._action = a;
this._name = name;
}
}
建立一个 MyModuleAttribute 给 Controllers 标记一些附加信息,主要为后面反射出 ModuleEntity
public class MyModuleAttribute : System.Attribute
{
readonly MyModule ID;
readonly string NAME;
public MyModuleAttribute(MyModule id, string name)
{
this.ID = id;
this.NAME = name;
}
public MyModule Id { get { return this.ID; } }
public string Name { get { return this.NAME; } } }
最后就是要建一个最主要的类 MyAuthorizeAttribute 我们需要重写AuthorizeAttribute 基类下的AuthorizeCore 方法已满足我们的权限要求,
public class MyAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
readonly string NAME;
readonly AuthorizeAction ACTION;
readonly MyModule MYMODULE;
public AuthorizeAction Action { get { return this.ACTION; } }
public string Name { get { return this.NAME; } }
public MyModule MyModule { get { return MYMODULE; } }
public MyAuthorizeAttribute(MyModule module,string name, AuthorizeAction action)
: base()
{
this.MYMODULE = module;
this.NAME = name;
this.ACTION = action;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!httpContext.User.Identity.IsAuthenticated)
return false;
var Identity = (System.Security.Claims.ClaimsIdentity)HttpContext.Current.User.Identity;
if (Identity.RoleClaimType != RoleType.System.ToString())
{
var v = string.Format("{0}.{1}",(int) this.MYMODULE,(int)ACTION) ;
foreach(var v1 in UserTicket.GetInstance().GetAuthorize(Identity.Name))
{
if (v == v1)
{
return true;
}
}
HttpContext.Current.Response.Redirect("/Error/Index");
}
return true;
}
现在方法已经建立好了,那这些方法怎么使用呢,我们在重新回到最开始的 IAuthorize 接口来说起
IAuthorize 接口是一个空的接口没有任何的实现方法,其实他的目的主要是为了 在程序运行时候反射出所有需要进行授权认证的 Controller
public class DefaultController : Controller, IAuthorize
{
public class ActionResult Index()
{
return view()
}
}
这样就我们就可以在程序启动的时候通过反射当前程序集下 所有继承 IAuthorize 接口的Controller
当仅仅这样还是不够的 我们可以看到 AuthorizeCore 方法下面 有一个比较操作,值是通过两个枚举拼接的,一个是行为 一个是模块
我们要为 Controller 添加模块信息 ,使用定义的MyModuleAttribute 类,在为Controller下具体的功能函数添加授权属性MyAuthorize ,被标记的方法就需要进行权限比较了
[MyModule(MyModule.Main , "主模块")]
public class DefaultController : Controller, IAuthorize
{
[MyAuthorize( MyModule.Main,"首页", AuthorizeAction.List)]
public ActionResult Index()
{
return View();
} }
这样一个动态的AuthorizeAttribute授权就完成了,但是也会有疑问 这里的MyModule 好像并没有什么太大的作用啊 ,
这里主要的权限验证 就是 MyAuthorize 类 ,MyModule 只是为了为页面提供数据,这样我们就无需将模块信息存到数据库中去了
MVC AuthorizeAttribute 动态授权的更多相关文章
- 七天学会ASP.NET MVC (四)——用户授权认证问题
		
小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会 Asp.Net MVC 第四篇出炉,在第四天的学习中,我们主要了学习如何在MVC中如何实现认证授权等问题,本节主要讲了验证错误时的错误值,客户端验 ...
 - [ASP.NET MVC] 利用动态注入HTML的方式来设计复杂页面
		
原文:[ASP.NET MVC] 利用动态注入HTML的方式来设计复杂页面 随着最终用户对用户体验需求的不断提高,实际上我们很多情况下已经在按照桌面应用的标准来设计Web应用,甚至很多Web页面本身就 ...
 - mvc中动态给一个Model类的属性设置验证
		
原文:mvc中动态给一个Model类的属性设置验证 在mvc中有自带的验证机制,比如如果某个字段的类型是数字或者日期,那么用户在输入汉字或者英文字符时,那么编译器会自动验证并提示用户格式不正确,不过这 ...
 - C#之asp.net 及MVC 生成动态验证码:
		
C#之asp.net 及MVC 生成动态验证码: 1.生成验证码字符串 // 随机生成指定长度的验证码字符串private string RandomCode(int length) { string ...
 - 【Docker】数据库动态授权组件在Kubernetes集群下的测试过程记录
		
背景 我们都知道出于安全性考虑,生产环境的权限一般都是要做最小化控制,尤其是数据库的操作授权,更是重中之重. 博主所在公司使用的是Kubernetes(k8s)进行的集群容器管理,因为容器发布时的IP ...
 - 业务逻辑:五、完成认证用户的动态授权功能  六、完成Shiro整合Ehcache缓存权限数据
		
一. 完成认证用户的动态授权功能 提示:根据当前认证用户查询数据库,获取其对应的权限,为其授权 操作步骤: 在realm的授权方法中通过使用principals对象获取到当前登录用户 创建一个授权信息 ...
 - 七天学会ASP.NET MVC (四)——用户授权认证问题 【转】
		
http://www.cnblogs.com/powertoolsteam/p/MVC_four.html 小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会 Asp.Net MVC 第四篇出炉,在 ...
 - asp.net mvc 使用AuthorizeAttribute做授权验证
		
授权验证,比如登陆验证 1.自定义属性继承AuthorizeAttribute 2.重写OnAuthorization方法 3.通过AllowAnonymousAttribute特性处理无需授权的Ac ...
 - 爱上MVC~AuthorizeAttribute验证不通过如何停止当前上下文
		
回到目录 我们知道mvc里有一些过滤器,AuthorizeAttribute用来做授权,一般在用户授权方面可以使用它,当使用没有登陆,我们直接跳到登陆页,这是没有问题的,可我要说的是,当用户对某个Ac ...
 
随机推荐
- oracle_PLSQL 快捷键使用技巧
			
PLSQL 快捷键使用技巧 2012-01-17 09:32:50标签:PLSQL PLSQL 编程工具快捷设置 PLSQL使用技巧 PLSQL 快捷键 oracle PLSQL 最近在开发过程中,遇 ...
 - maven_修改setting ,改为自己私服或者OSC开源中国 [为解决sqlite-jdbc 在中央仓库找不到]
			
因为项目要使用到sqlite ,虽然有现成的jar,但是考虑的项目的易用统一管理,决定还是用maven 结果纠结了半天 sqlite-jdbc 在maven默认的仓库根本找不着,于是乎修改 setti ...
 - Android MediaPlayer 和 NativePlayer 播放格式控制
			
对于本机MediaPlayer 支持格型式试验: 对于原生 NativeMedia 的支持格式測试: 这个支持就比較失望了,眼下測试的手机仅仅支持 H.264视频及AAC音频,其他的格式都不支持. 使 ...
 - WCF消息交换模式之双工通讯(Duplex)
			
WCF消息交换模式之双工通讯(Duplex) 双工通讯Duplex具有以下特点: 1它可以在处理完请求之后,通过请求客户端中的回调进行响应操作 2.消息交换过程中,服务端和客户端角色会发生调换 3.服 ...
 - CentOS-6.3安装配置SVN
			
安装说明 系统环境:CentOS-6.3 安装方式:yum install (源码安装容易产生版本兼容的问题) 安装软件:系统自动下载SVN软件 检查已安装版本 #检查是否安装了低版本的SVN [ro ...
 - c语言下多线程
			
原文:c语言下多线程 [问题]创建了10个线程,10个线程公用一个线程体,创建如下: int t1=0,t2=1,t3=2,t4=3,t5=4,t6=5,t7=6,t8=7,t9=8,t10=9; i ...
 - typeof小结
 - NET Web开发
			
.NET Web开发初学者必知的四个网站 No.1 W3school 链接: http://www.w3school.com.cn/ 预览: 介绍: 全球最大Web前端技术教程网站.内容涵盖从基础 ...
 - C# 打开网页兼容Windows8.1的方式
			
方法:指定浏览器 void WebWithDefaultBrower() { string name = string.Empty; try { string mainKey = @"htt ...
 - Android总结的基本机制监控事件
			
研究上午Android底层机制事件监视器,例如下面的摘要: 内核驱动监控硬件状态和行为,由uevent机制将事件发送到用户空间: 通过用户空间UeventObserver从内核监控uevent,处理. ...