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
。任何一个权限,内容类似,差别仅是状态枚举不一样,当然,名称也不一样。基于此,我就写了一个模板工具,只要给出名称和状态枚举值,就自动生成这三个文件。