接触CAS(一)

    技术2022-05-11  74

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

    最新回复(0)