利用EntLib授权机制实现对ASP.NET页面的自动授权
ASP.NET默认采用UrlAuthorizationModule和FileAuthorizationModule分别实现针对请求地址和物理文件的授权,但是在很多情况下我们需要额外的授权方式。Entlib提供了一种基于表达式的授权方式,它允许我们以一个表达式的方式来定义授权的规则。在新的项目中我们希望利用EntLib的授权框架来实现针对ASP.NET页面的自动授权,本文描述的解决方案是我刚刚想到的,希望广大网友朋友们帮助评估一下。[源代码从这里下载]
目录
一、实例演示
二、AuthorizationFilterAttribute
三、AuthorizeAttribute
四、PageBase
一、实例演示
我们先来作一个简单的实例演示。如下所示的EntLib安全模块的配置,如果读者对此不了解也没有关系,在这里我们只需要关注定义其中的一个授权规则(Authorization Rule):“I:Foo OR R:Admin”。这是一个逻辑表达式,前缀I:和R:分别表示用户名(Identity)和角色(Role),整个表达式表示的授权逻辑是:“帐号为Foo的用户和所有具有Admin角色的用户”有权限方法与此表达式关联的操作或者资源。配置还定义了该授权规则的名称“FooOrAdmin”。
1: <configuration>
2: <configSections>
3: <section name="securityConfiguration"
4: type="Microsoft.Practices.EnterpriseLibrary.Security.Configuration.SecuritySettings,
5: Microsoft.Practices.EnterpriseLibrary.Security"/>
6: </configSections>
7: <securityConfiguration defaultAuthorizationInstance="Authorization Rule Provider">
8: <authorizationProviders>
9: <add name="Authorization Rule Provider"
10: type="Microsoft.Practices.EnterpriseLibrary.Security.AuthorizationRuleProvider,
11: Microsoft.Practices.EnterpriseLibrary.Security">
12: <rules>
13: <add expression="I:Foo OR R:Admin" name="FooOrAdmin" />
14: </rules>
15: </add>
16: </authorizationProviders>
17: </securityConfiguration>
18: </configuration>
我们添加一个需要授权的Web页面(Default.aspx),并且使用上面定义的表达式来作为该页面的授权规则,我们通过自定义的AuthorizeAttribute特性实现两者之间的关联(该特性构造函数中指定的字符串正是配置的授权规则名称)。除此之外,Web页面对应的类型继承自我们自定义的基类PageBase。
1: [Authorize("FooOrAdmin")]
2: public partial class Default : PageBase
3: {
4: }
我们随后添加一个登录页面,具体的实现就不再这里一一介绍了。为了模拟不同的登录用户具有不同的权限,我们通过注册HttpApplication的AuthenticateRequest事件来对当前Principal进行定制。具体的定义如下所示:如果用户名为Bar,我们让当前的Principal具有Admin角色,对于其他帐号的登录用户,角色列表为空。
1: public class Global : System.Web.HttpApplication
2: {
3: protected void Application_AuthenticateRequest(object sender, EventArgs e)
4: {
5: if (null == HttpContext.Current.User || !HttpContext.Current.User.Identity.IsAuthenticated)
6: {
7: return;
8: }
9:
10: IIdentity identity = new GenericIdentity(HttpContext.Current.User.Identity.Name);
11: string[] roles = null;
12: if (identity.Name.ToLower() == "bar")
13: {
14: roles = new string[] { "Admin" };
15: }
16: HttpContext.Current.User = new GenericPrincipal(identity, roles);
17: }
18: }
由于页面Default.aspx与配置名称为FooOrAdmin的授权规则进行了关联,根绝授权规则表达式定义和针对不同用户的角色列表,意味着当我们以账户Foo和Bar登录后才能访问该页面,“自动化授权”可以通过下图得到证实:当前用户为Foo和Bar时,页面得以正常显示;而当我们以Baz的身份登录后,显示“Access denied…”。
![](/assets/blank.gif)
二、AuthorizationFilterAttribute
这里我吸取了ASP.NET MVC基于AuthorizationFilter的授权方式,不同的是AuthorizationFilter在ASP.NET MVC中以特性的方式应用到Controller类型和Action方法上,这里我们则将它应用到Web页面对应的类上。AuthorizationFilterAttribute作为授权筛选器特性的基类定义如下,由于多个特性可以同时应用到同一个类型上,它们的执行顺序通过属性Order来控制。具体的授权判断以及对非授权请求的处理定义在方法OnAuthorization方法上。
1: [AttributeUsage( AttributeTargets.Class, AllowMultiple = true)]
2: public abstract class AuthorizationFilterAttribute:Attribute
3: {
4: public int Order { get; set; }
5: public abstract bool OnAuthorization(AuthorizationContext context);
6: }
7:
8: public class AuthorizationContext
9: {
10: public HttpContext HttpContext { get; private set; }
11: public bool UnAuthorizedRequestHandled { get; set; }
12:
13: public AuthorizationContext(HttpContext httpContext)
14: {
15: this.HttpContext = httpContext;
16: }
17: }
OnAuthorization方法返回值代表的是真否授权的判断,它具有一个类型为AuthorizationContext参数。AuthorizationContext是对HttpContext对象的封装,属性UnAuthorizedRequestHandled 表示是否完成了针对非授权请求的处理。如果多个AuthorizationFilterAttribute应用到同一个类型上,如果前面执行的AuthorizationFilterAttribute将传入的AuthorizationContext的这个属性设置为True,后续的将不在执行。
三、AuthorizeAttribute
基于EntLib的授权通过AuthorizeAttribute来实现。如下面的代码片断所示,AuthorizeAttribute 直接继承自AuthorizationFilterAttribute,代表授权规则配置名称的属性AuthorizationRule 在构造函数中被初始化。在实现的OnAuthorization我们按照Entlib授权框架的编程模式判断当前Principal是否具有针对指定授权规则的权限,对于非授权请求我们直接调用HandleUnauthorizedRequest方法进行处理。具体的处理逻辑很简单:直接相应一段文字“Access denied…”(正是上面截图中显示的文字)。出于可扩展的考虑,我们将此方法定义成受保护的虚方法。
1: [AttributeUsage( AttributeTargets.Class, AllowMultiple = true)]
2: public class AuthorizeAttribute : AuthorizationFilterAttribute
3: {
4: public string AuthorizationRule { get; private set; }
5: public AuthorizeAttribute(string authorizationRule)
6: {
7: Guard.ArgumentNotNullOrEmpty(authorizationRule, "authorizationRule");
8: this.AuthorizationRule = authorizationRule;
9: }
10:
11: public override bool OnAuthorization(AuthorizationContext context)
12: {
13: IAuthorizationProvider authorizationProvider = AuthorizationFactory.GetAuthorizationProvider();
14: if (authorizationProvider.Authorize(context.HttpContext.User, this.AuthorizationRule))
15: {
16: return true;
17: }
18: this.HandleUnauthorizedRequest(context);
19: return false;
20: }
21:
22: protected virtual void HandleUnauthorizedRequest(AuthorizationContext context)
23: {
24: context.HttpContext.Response.Write(context.HttpContext.User.Identity.Name + ": Access denied...");
25: }
26: }
四、PageBase
我们知道针对一个ASP.NET 资源的请求最后大都通过一个对应的HttpHandler来处理,这个授权解决方案的基本思路就是通过自定义HttpHandler实现自动化授权检验。Page类型是我们最为熟悉的HttpHandler,为此我们定义了如下一个继承自它的类型PageBase。如下面的代码片断所示,在重写的ProcessRequest方法中实现了对应用在当前类型上的AuthorizationFilterAttribute特性的解析和执行,进而提供了对授权的实现。
1: public abstract class PageBase: Page
2: {
3: public override void ProcessRequest(HttpContext context)
4: {
5: var filterAttributes = this.GetType().GetCustomAttributes(true)
6: .OfType<AuthorizationFilterAttribute>()
7: .OrderBy(attribute => attribute.Order);
8: AuthorizationContext authorizationContext = new AuthorizationContext(context);
9: bool isAuthorized = true;
10: foreach (AuthorizationFilterAttribute attribute in filterAttributes)
11: {
12: isAuthorized = attribute.OnAuthorization(authorizationContext);
13: if (authorizationContext.UnAuthorizedRequestHandled)
14: {
15: break;
16: }
17: }
18:
19: if (isAuthorized)
20: {
21: base.ProcessRequest(context);
22: }
23: }
24: }
出处:http://artech.cnblogs.com/
转载于:https://www.cnblogs.com/CLR010/archive/2012/11/05/2755050.html
利用EntLib授权机制实现对ASP.NET页面的自动授权相关推荐
- java iris_利用K-Means聚类算法实现对iris.data.ulab
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 利用K-Means聚类算法实现对iris.data.ulabel数据的聚类,这是在网上找到如果要换成我的iris.date iris.date.ulabl ...
- CV之FDFA:利用MTCNN的脚本实现对LFW数据集进行FD人脸检测和FA人脸校准
CV之FD&FA:利用MTCNN的脚本实现对LFW数据集进行FD人脸检测和FA人脸校准 目录 运行结果 运行过程 运行(部分)代码 在裁剪好的LFW数据集进行验证 运行结果 运行过程 time ...
- Qt实战案例(28)——利用QSQL相关类实现对MySQL数据库的基本操作及相关设置详解
目录 一.项目介绍 二.项目基本配置 2.1 安装MySQL 2.2 创建Qt项目 2.3 移动libmysql.dll文件 三.UI界面设计 四.主程序实现 4.1 pro文件 4.2 main.c ...
- VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的简介、案例应用之详细攻略
VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的简介.案例应用之详细攻略 目录 调用SolidWorks功能简介 1.宏录制步骤 (1) ...
- 利用scrapy+splash+redis实现对JS动态生成网页的增量爬取
文章目录 一.任务内容 二.Scrapy安装.配置.调试 三.splash安装.配置.调试 开启hyper-v 安装Docker Desktop 拉取和开启Splash 安装scrapy-splash ...
- python3:利用openpyxl xlwt xlrd实现对excel的增删改查和读入
记录一下本次实践作业,show code. import openpyxl import xlrd import xlwt from datetime import date, datetime fr ...
- 原生js来实现对dom元素class的操作方法
jQuery操作class的方式非常强大 写了一个利用原生js来实现对dom元素class的操作方法 1.addClass:为指定的dom元素添加样式 2.removeClass:删除指定dom元素的 ...
- atitit.it企业管理 项目管理 中的 授权机制 的来源 君权神授 的一定合理性
atitit.it企业管理 项目管理 中的 授权机制 的来源 君权神授 的一定合理性 1. 授权(权利来源)的5种模式 1 2. 企业的组织机构与管理运作来源于国家的管理...而国家的管理又来源于宗教 ...
- ASP.NET Core 认证与授权[7]:动态授权
基于资源的授权 有些场景下,授权需要依赖于要访问的资源,例如:每个资源通常会有一个创建者属性,我们只允许该资源的创建者才可以对其进行编辑,删除等操作,这就无法通过[Authorize]特性来指定授权了 ...
最新文章
- 金蝶云如何html5登录,第三方系统单点登录到金蝶云指南V2
- 自律到极致-人生才精致:第13期
- 紧急通知!不要在MySQL中使用UTF-8编码!!!
- ionic4 组件的使用(二)
- pytorch 入门学习 实现线性回归-5
- 编写一个函数,能够接受至少两个参数,返回最大最小值。
- kafka入门1-集群生产消息 报:ERROR Producer connection to localhost:9092 unsuccessful
- java 接口返回不带双引号_Java入门:基础知识
- android apk编译工具,编译apk文件需要使用哪些软件?安卓apk反编译教程
- java的学习--第一章 java基础入门
- Java Logging之JUL系列——Log Levels
- 2015年史玉柱演讲实录
- [JAVA]用数学解释数组移步问题(新增对链表移步的解释)
- Homekit智能家居DIY设备一智能灯泡
- 在QT中使用MySQL数据库
- 数据存储大讲堂:谈磁盘列阵与RAID技巧
- Ubuntu22.04 安装配置流水账
- 图像处理——低频、高频和噪声、细节、边缘
- 使用Java导出数据到Excel
- 开源办公OA开发:新版考勤管理介绍
热门文章
- 先庆祝一下,冠军的心博客园诞生了!!
- Ubuntu Server 16.04服务器版配置图解教程06 - 安装MySql
- ajax传递对象数组
- Django框架视图类
- automapper
- 工作经验(体感开发篇)
- Wmap5 测试80端口 Your port 80 is actually used by :Server: Microsoft-HTTPAPI/2.0
- No identities are available for signing的解决方法
- Maatkit工具使用lt;一gt;之mysql主从数据校验工具
- [置顶] 安卓高手之路之ClassLoader(二)