安全要求
更新:2007 年 11 月
若要确保只有被授予了指定权限的调用方才能够调用您的代码,可以声明方式或强制方式要求您的代码的调用方拥有特定的权限或权限集。要求使运行库执行安全检查,从而对调用代码实施限制。在安全检查过程中,运行库遍历调用堆栈,检查堆栈中每个调用方的权限,然后确定是否已将要求的权限授予每个调用方。如果发现某个调用方没有要求的权限,则安全检查将失败,并将引发 SecurityException。不会导致堆栈审核的要求只有链接要求,这些要求只检查直接调用方。
可以使安全检查在每次调用特定的方法时或执行特定的代码块前执行。如果想在调用特定类的任何成员时进行安全检查,则可以将要求放在该类之前,从而使之应用到该类的每个成员。此主题的其余部分说明如何发出安全要求,何时发出,以及为什么选择一种类型的安全要求而不选择另一种。
如果您正在编写一个直接访问受保护的资源的库,并且这种访问对调用方是公开的,则必须在库中发出安全要求,以帮助验证调用堆栈中的所有调用方是否都有访问该资源的权限。要求可以是声明性或者强制性。注意,绝对不要在类构造函数中发出要求,因为不能保证类构造函数代码在任何特定的点或任何特定的上下文中执行。因为类构造函数中调用堆栈的状态的定义不完善,所以放置在类构造函数中的要求可能会产生意外结果。
无论发出什么类型的要求,都应当按照下面的指南操作:
通过要求调用方拥有特定的标识权限,确保调用方来自特定的站点或区域,或由特定的发行者签名。但是,只能在根据与标识匹配即给予额外访问权限时执行此操作,而不能在根据与标识匹配即拒绝访问时执行此操作。因为修改或屏蔽代码的标识比较容易,所以单独根据标识来拒绝访问并不是保护您的代码及其访问的资源不受未经授权访问的可靠方法。
通过将要求放到某对象的类级别上,确保只能由拥有特定权限的调用方创建该对象。例如,假定有一个名为 myFileStream 的类,该类是从 FileStream 类派生的,您想确保只有授权的调用方才能够创建 myFileStream 的实例。此时,应将对 FileIOPermission 对象(表示访问由 myFileStream 类创建的流的权限)的声明式要求放到 myFileStream 类的类级别上。
还可以在代码中放置设置或获取属性的要求。一般情况下,应将对限制性较小的权限的要求放到 get 访问器上,而不应放到 set 访问器上,除非该属性包含敏感信息(如密码)。
说明:
基于角色的安全检查与代码访问安全检查在语义上稍有不同。有关更多信息,请参见基于角色的安全性。
说明:
要求只能应用于类、方法、事件和属性级别;程序集和单个非私有变量成员不受要求的保护。针对程序集或非私有变量级别的要求将不会产生编译器警告。因此,一定要使用属性而不是公共成员以确保要求提供的保护。