接触CAS(一)

来源:互联网 发布:金蝶k3数据字典 下载 编辑:程序博客网 时间:2024/04/28 03:41
Author:水如烟
 
这几天接触CodeAccessPermission,目的是看看权限是如何控制的,结果是头越来越头,脑袋越来越紧,糊涂哪。
 
涉及的概念太多了。对于象我一样的只是玩玩看看编编程序的好事之徒来说,要短时间内消化它真的好难。所以只有在BLOG上置一个专题,慢慢的来领会它。
 
基于自己的理解,实现CAS,应该有三个地方需要着眼:
A、定义权限
B、目标标识
C、程序域部署
 
现在仅仅略知AB的一些皮毛,C还没接触。
 
自定义代码访问权限,必须实现System.Security.CodeAccessPermission(CAP)。关于CAPMicrosoftTechNET的一篇文章,《如何创建》说得很清楚。这里是它提供的一张图示,以下也重打它的说明(一个字一个字打,不复制粘贴):
 
图中EncryptionPermission是其文要实现的一个加解密权限。
 
实现CAP,通常只是实现图中所示的七个方法:CopyUnionIntersetIsSubsetOfIsUnrestrictedFromXmlToXml。意义如下:
Copy,创建一个与当前权限实例完全相同的副本,并将其返回调用方。思考:调用方A是谁,A什么时候需要这个副本,A用这个副本做些什么事了。
Union,返回一个权限对象,该对象是在当前权限和提供的权限之间的并集结果。思考:这个“当前权限”和“提供权限”哪是哪哪。
Interset,返回一个权限对象,该对象是在当前权限和所提供的权限之间的交集结果。
IsSubsetOf,返回一个布尔值,以提示当前权限是否是所提供的权限的子集。如果是子集,则当前权限的每项状态都必定在目标权限中。
IsUnrestricted,如果权限实例处于不受限制状态,此方法返回True
FromXmlToXml,前者将XML格式转换为权限对象实例,后者将权限对象的实例转换为XML格式。用于支持序列化。如,当程序集元数据中存储安全性属性时,将使用这些方法。
 
上面方法中有关权限集合运算的,如子集,交集,并集,是基于“状态”枚举,这个“状态”枚举,一般是操作类型的枚举,如可读、可写、可删除,简单的就是:ReadWriteDelete
还要表示出全无,全有,所以都需要NoAll。要表示出来,能够按位运算,枚举类就需要标识<Flag>,同时也要给出各个状态值。
 
如:
<Flags>_
Public Enum FileAccessFlags
       NoFlags = 0
       Read = 1
       Write = 2
       Delete = 4
       AllFlags = 7
End Enum
文件中常用到的操作权限,还有可读写,它是Read Or Write,可以补充为:
<Flags>_
Public Enum FileAccessFlags
       NoFlags = 0
       Read = 1
       Write = 2
       ReadWrite = 3
       Delete = 4
       AllFlags = 7
End Enum
 
定义权限有三个步骤,就是:定义操作枚举,实现CodeAccessPermission,实现CodeAccessSecurityAttribute。任何一个权限,内容类似,差别仅是状态枚举不一样,当然,名称也不一样。基于此,我就写了一个模板工具,只要给出名称和状态枚举值,就自动生成这三个文件。
 
原创粉丝点击