CodeAccessPermission.PermitOnly 方法

定义

防止处于调用堆栈较高位置的调用函数使用此代码,此代码将调用此方法来访问除当前实例指定的资源以外的所有资源。

public:
 virtual void PermitOnly();
public void PermitOnly ();
abstract member PermitOnly : unit -> unit
override this.PermitOnly : unit -> unit
Public Sub PermitOnly ()

实现

例外

已存在一个用于当前帧的活动的 PermitOnly()

注解

重要

方法 PermitOnly 仅用于防止完全受信任的代码意外访问资源。 它不应用于防止资源被不受信任的代码故意滥用。 例如,如果方法A为权限颁发 ,PermitOnly然后调用 方法 B,则方法B可以通过发出 Assert来公开替代 PermitOnly 。 调用的方法在堆栈中始终较高。 因此,如果方法 B 尝试访问受保护的资源,则安全系统开始检查其权限,因为方法 B 是直接调用方,然后向下浏览堆栈以确认堆栈中没有 DenyPermitOnly 更低。 尝试访问资源的方法 B可以使用 方法立即 Assert 停止堆栈演练。 在这种情况下, PermitOnly 永远不会发现按方法 A 放置在堆栈上的 (调用方法) 。

PermitOnly Deny类似于 ,因为两者都会导致堆栈访问失败,否则会成功。 区别在于指定 Deny 会导致堆栈访问失败的权限,但 PermitOnly 指定不会导致堆栈访问失败的唯一权限。

调用此方法可确保代码可用于仅访问指定的资源。 在 PermitOnly 调用代码返回到调用方之前,对 的调用有效。 一个帧上只能有一个 PermitOnly 处于活动状态。 当帧上存在活动PermitOnly时,尝试调用 PermitOnly 会导致 SecurityException。 调用 RevertPermitOnlyRevertAll 以删除活动的 PermitOnly

PermitOnly 对于未授予的权限,将被忽略,因为对该权限的要求不会成功。 但是,如果调用堆栈中较低的代码稍后调用 Demand 该权限, SecurityException 则当堆栈访问尝试调用 PermitOnly的代码时,将引发 。 这是因为调用 PermitOnly 的代码尚未被授予权限,即使它调用 PermitOnly 了该权限。 调用堆栈通常表示为向下增长,因此调用堆栈中较高方法调用调用堆栈中较低的方法。

继承者说明

不能重写此方法。

适用于