System.Security.CodeAccessPermission.PermitOnly 方法

方法描述

防止调用堆栈中处于较高位置的调用方通过调用此方法的代码来访问除当前实例指定的资源外的所有资源。

语法定义(C# System.Security.CodeAccessPermission.PermitOnly 方法 的用法)

public void PermitOnly()

参数/返回值

参数值/返回值 参数类型/返回类型 参数描述/返回描述
返回值 void

提示和注释

重要事项

PermitOnly 方法只应用于防止完全信任代码意外访问资源。 不应将其用于防止不受信任的代码有意滥用资源。 例如,如果方法 A 为某权限发出 PermitOnly,然后调用方法 B,则方法 B 可通过发出 Assert 而公开替代 PermitOnly。 调用的方法通常位于堆栈中较高的位置。 因此,如果方法 B 尝试访问受保护的资源,则安全系统会开始检查该方法的权限(因为方法 B 是直接调用方),然后依次审核堆栈中的各项,以确认堆栈较低的位置没有 Deny 或 PermitOnly。 尝试访问资源的方法 B 可以通过使用 Assert 方法立即停止堆栈审核。 在这种情况下,永远不会发现方法 A(调用方法)在堆栈上放置的 PermitOnly。

PermitOnly 与 Deny 相似,因为两者在堆栈遍历本应成功时都会导致堆栈步失败。 两者的差别在于:Deny 指定将导致堆栈遍历失败的权限,而 PermitOnly 仅指定不会导致堆栈遍历失败的权限。

调用此方法以确保您的代码只能用来访问指定的资源。 在调用代码返回到它的调用方之前,对 PermitOnly 的调用一直有效。 一个帧上只能有一个活动的 PermitOnly。 如果尝试在帧上存在活动 PermitOnly 时调用 PermitOnly,则会导致 SecurityException。 调用 RevertPermitOnly 或 RevertAll 以移除活动的 PermitOnly。

对未授予的权限忽略 PermitOnly,因为对该权限的请求不会成功。 但是,如果调用堆栈上的低级代码后来对该权限调用 Demand,则当堆栈遍历到达曾尝试调用 PermitOnly 的代码时将引发 SecurityException。 这是因为调用 PermitOnly 的代码尚未被授予权限,即使该代码对该权限调用了 PermitOnly。 调用堆栈一般表示为缩小,以便调用堆栈中较高的方法可调用调用堆栈中较低的方法。

对继承者的说明

不能重写此方法。

System.Security.CodeAccessPermission.PermitOnly 方法例子


异常

异常 异常描述
SecurityException 当前框架已经有一个活动的 PermitOnly。

命名空间

namespace: System.Security

程序集: mscorlib(在 mscorlib.dll 中)

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。