应用程序集声明主要有三种——RequestMinimum, RequestOptional, and RequestRefuse,它们简述如下:
RequestMinimum -- 程序集运行的绝对必要权限集。
RequestOptional -- 程序集运行的可选权限集,拥有这些权限集会更好的执行,但非必要。
RequestRefuse -- 程序集不应该被授予的权限集。
每一个程序集都可以使用上面三个中的任意一个或多个,最终程序集的权限集取决于已定义的所有特性(Attributes)定义的权限集的并集(union)。
RequestRefuse给人很直观的理解:任何权限集被加到程序集的拒绝列表,程序集就绝不会执行,也就是说,只要赋予了不该拥有的权限集,程序集就不会执行;而另外两个就有点晦涩了,尤其是它们所起的副作用(side effect)。为了演示RequestMinimum和RequestOptional,这里我打算用下面的代码,适当的赋予不同的程序集级别的安全声明来说明:
1public static class DeclarativeSecurity
2{
3 public static void Main()
4 {
5 Console.WriteLine(\"In Main\");
6 if(HaveFileIO())
7 Console.WriteLine(\"Have full FileIO permission\");
8 else
9 Console.WriteLine(\"Do not have full FileIO permission\");
10 }
11
12 private static bool HaveFileIO()
13 {
14 try
15 {
16 new FileIOPermission(PermissionState.Unrestricted).Demand();
17 }
18 catch(SecurityException)
19 {
20 return false;
21 }
22
23 return true;
24 }
25}
RequestMinimum告诉CLR在没有赋予相应权限集时不能执行你的代码,所以如果我给程序集加上如下特性(attribute):
[assembly: FileIOPermission(SecurityAction.RequestMinimum, Unrestricted = true)]
并且从Intranet zone执行程序集,是调用不成功的。当CLR扫描到程序集不能运行在没有提供无限制的文件读写权限集(unrestricted FileIO permission),并且发现本地网络权限(Intranet permission)绝不会赋予文件读写权限集时,加载器(loader)会拒绝加载程序集,同时,你会收到一个FileLoadException,它的内部异常是PolicyException,描述如下: [Page]
Unhandled Exception: System.IO.FileLoadException: Could not load file or assembly ’ReqMin, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null’ or one of itsdependencies. HRESULT 0x80131417 (CORSEC_E_MIN_GRANT_FAIL) Failed to grant minimum permission requests.
File name: ’ReqMin, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null’ --->
System.Security.Policy.PolicyException: Required permissions cannot be acquir