重写安全检查

更新:2007 年 11 月

通常,安全检查会检查调用堆栈中的每个调用方来确保将指定的权限授予了每个调用方。但是,您可以通过对单个权限对象或一个权限集对象调用 AssertDenyPermitOnly 来重写安全检查的结果。即使可能并未检查调用堆栈上所有调用方的权限,您也可以使安全检查成功或失败,这取决于您调用的是这些方法中的哪一种方法。

每当一个方法调用另一方法时,都会在调用堆栈上生成一个新框架来存储有关所调用方法的信息。(使用构造函数和访问属性在此上下文中认为是方法调用。) 每个堆栈框架都包括有关该方法向 AssertDenyPermitOnly 发出的任何调用的信息。如果一个调用方在同一方法调用中使用了多个 AssertDenyPermitOnly,则运行库会应用下列处理规则(这些规则可能会影响重写行为):

  • 如果在堆栈审核期间,运行库发现在一个堆栈框架中同一类型的重写不止一个(如两次调用 Assert),则第二个重写会引发异常。

  • 在同一堆栈框架中存在不同的重写时,运行库会按下面的顺序处理这些重写:首先是 PermitOnly,然后是 Deny,最后是 Assert

若要替换重写,请首先调用相应的恢复方法(例如 RevertAssert),然后应用新的重写。

说明:

在类构造函数中绝对不要进行堆栈审核重写,因为不能保证在任何特定的点或任何特定的上下文中执行类构造函数代码。由于类构造函数中的调用堆栈状态的定义不完善,所以放置在构造函数中的堆栈步重写可能会产生意外结果。

应用程序开发人员通常不需要使用 AssertDenyPermitOnly,而组件和类库开发人员也很少需要使用它们。然后,安全重写适用于 AssertDenyPermitOnly 三个主题中描述的一些情况。

说明:

如果执行重写(DenyAssertPermitOnly),则必须先恢复权限,才能在同一堆栈框架(即方法)中执行同一种重写。否则,将引发 SecurityException。例如,如果拒绝了权限 P,则您必须先恢复该权限,之后才能在相同的方法中拒绝另一个权限 Q。

使用下表中列出的静态方法之一恢复重写。

方法

方法操作

CodeAccessPermission.RevertAll

使当前框架所有以前的重写都被移除并不再有效。

CodeAccessPermission.RevertAssert

使当前框架所有以前的 Assert 都被移除并不再有效。

CodeAccessPermission.RevertDeny

使当前框架所有以前的 Deny 都被移除并不再有效。

CodeAccessPermission.RevertPermitOnly

使当前框架所有以前的 PermitOnly 都被移除并不再有效。

请参见

概念

编写安全类库

参考

使用 Assert 方法

使用 Deny 方法

使用 PermitOnly 方法

其他资源

代码访问安全性