您的位置:首页 > 运维架构

利用 AOP 实现 .NET 上完整的基于角色的访问控制(RBAC)模型

2010-02-03 16:44 1091 查看
一. 背景.NET 平台上没有完整的 RBAC 机制,.NET 中的安全模型(代码访问安全性:CAS)只是实现到 Role 层次,没有细化到 Task 层次,ASP.NET 2.0 中的诸多安全机制,如 Membership、Web.Config 的安全配置,都只能针对 Role 进行设置,大家在利用这些安全机制,往往需要在程序/代码硬编码(HardCode)角色,这样就无法实现在运行期自定义角色的功能Windows 2000/2003 中自带的 Authorization Manager 虽然实现了较为完整的RBAC模型,但一般只适用于 Windows 用户,而且也需要手动去进行权限检查(调用 AccessCheck方法)权限检查是一个通用操作,最好的实现方式就是面向方面的编程(AOP)二、相关主题介绍RBAC模型的要素:三个实体:用户、角色、任务(或操作)(User、Role、Task),其稳定性逐渐增强,两个关 系,User<->Role、Role<->Task,其中: User 是日常管理运行时建立Role 是部署/交付建立Task 是开发时确定User<->Role 是日常管理运行时建立Role<->Task 是部署/交付时建立一般来说,Task是固定的,是和应用程序紧密绑定的,即使对之进行硬编码,也没有关系User/Role 部分比较容易实现,例如ASP.NET 2.0中 Membership 的实现三、具体实现注:本文中实现 AOP 的思路主要来自于如下文章:Aspect Oriented Programming using .NET - AOP in C# (http://www.developerfusion.co.uk/show/5307/3/) ,这是我看到的、在.NET 上实现 AOP最简捷/方便的方法,它不便提供了原理介绍,也提供了 Visual Studio 2005 的 Sample Project ,其中有 Security Check 和 Logging 的 AOP 功能。它的优点在于,在实现 AOP 的同时,不需要再去建立接口(这是很多人的做法),直接在原有类上进行少量改动,即可实现完整的 AOP 功能。1. 定义描述“Task”(任务)的 Attribute
using System;

namespace BusinessLogic.Security
2. 编写权限检查的 AOP 类 SecurityAspect,完成权限检查的功能
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Activation;

namespace BusinessLogic.Security
<?xml version="1.0" encoding="utf-8"?>
<ACL>
<Tasks>
<Task Name="AddItem" Description="增加" />
<Task Name="ModifyItem" Description="修改" />
<Task Name="RemoveItem" Description="删除" />
<Task Name="ListItem" Description="获取列表" />
</Tasks>
<Roles>
<Role Name="Manager">
<Task Name="AddItem" />
<Task Name="ModifyItem" />
<Task Name="RemoveItem" />
<Task Name="ListItem" />
</Role>
</Roles>
</ACL>
 AzMan.cs 完成角色/任务映射关系的检查
using System;using System.Collections.Generic;using System.Text;using System.Xml;namespace BusinessLogic.Securityusing System;using System.Collections.Generic;using System.Text;using System.Xml;using System.Web;using System.Web.Security;using System.Diagnostics;using System.Reflection;using System.Web.Caching;namespace BusinessLogic.Securitynamespace BusinessLogic
这样就可以了,CLR 会在运行时检查类的 PermissionCheck?Attribute,然后寻找方法上的 Task ,取出当前用户对应的 Role ,再去进行匹配检查,如果不能执行此操作,会抛出 UnauthorizedAccessException 的异常,在外部进行处理即可(如在 ASP.NET 中增加 ErrorPage 等)5. 其他相关功能的实现Q:如果我写程序时,在各个业务逻辑类定义了大量的 Task ,如果统一提取出来?A:利用反射可取出程序集中定义的所有 Task ,代码如下:
List<string> dic = new List<string>();StringBuilder sXml = new StringBuilder("");string curDir = this.GetCurrentPath();Assembly ass = Assembly.LoadFile(curDir + "\\AppFramework.BusinessLogic.dll");foreach (Type t in ass.GetTypes())
此段代码是将 Task 定义保存到 XML 文件中,如果你想保存到 SQL Server/Authorzatiom Manager 中,对代码稍加修改即可。Q:程序中的 Role 如何实现?A:如果是 ASP.NET 应用程序,可以直接利用其中的 MemberShip Role 机制,还是比较简单的Q:如果我想在界面上预先实现一些控制,如某用户不能进行某项操 作,则直接将其对应的 Button 禁止或隐藏(Disable/Invisible)掉,如何做?A:这可以利用 ASP.NET 2.0 中的表达式功能,直接检查当前用户的角色是否可以执行 Task ,如果不行,则利用返回的 Bool 值直接设置 Button 等控件的属性,做法如下:1)在 App_Code 下定义表达式类 PermissionCheckExpressionBuilder.cs
[ExpressionEditor(typeof(PermissionCheckExpressionBuilderEditor))][ExpressionPrefix("PermissionCheck")]public class PermissionCheckExpressionBuilder : ExpressionBuilderpublic class PermissionCheckExpressionBuilderEditor : System.Web.UI.Design.ExpressionEditor
2)在 Web.Config 中加入上述表达式定义,以便可以直接在页面上引用
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"><expressionBuilders><add expressionPrefix="PermissionCheck" type="PermissionCheckExpressionBuilder"/>expressionBuilders>configuration>
3)直接在页面控件的相应属性上绑定表达式,如:如果能执行此操作则显示,否则则隐藏
    <asp:Button ID="Button1" runat="server" Text="AddItem" Visible="<%$ PermissionCheck:AddItem %>" />
如果能执行此操作则启用,否则则禁止
    <asp:Button ID="Button2" runat="server" Text="AddItem" Enabled="<%$ PermissionCheck:AddItem %>" />
4)如果想在代码中自行检查权限,可以直接调用相应方法,如:
protected void Button1_Click(object sender, EventArgs e)
5)如何建立 User<-->Role 的映射,Role<-->Task的映射前者较为简单,ASP.NET 2.0 中就已经具有此功能,当然你也可以利用其 API 来实现自己的定义界面。对于 Role-Task 的映射来说,首先利用上面的代码从程序集中取出所有 Task ,保存在 XML 文件中,然后在进行配置时,可以显示 Role 和 Task ,来进行映射。如下图所示:角色与任务的映射用户与角色的映射
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐