请求权限

更新:2007 年 11 月

请求权限是您让运行库知道需要允许代码执行哪些操作的方法。应通过将属性(声明式语法)放到代码的程序集范围内来为程序集请求权限。创建程序集后,语言编译器将请求的权限存储在程序集清单中。加载时,运行库检查权限请求,并应用安全策略规则来确定授予程序集哪些权限。请求只会促使运行库拒绝将权限给予代码,而永远不会促使运行库将更多权限给予代码。授予您的代码的最大权限最终总是由本地管理策略来控制。

虽然编译代码不需要请求权限,但由于下面几个重要原因,代码总是应该请求权限:

  • 如果允许代码执行,则请求权限可增加代码正常运行的可能性。请求最小的权限集的代码将不会运行,除非它接收到这些权限。如果未标识最小的权限集,则您的代码必须能够处理一切情况;而在有些情况下,不授予某些权限会使代码无法正常执行。

  • 请求权限有助于确保只将代码需要的权限授予代码。如果没有授予代码额外权限,则即使恶意代码利用您的代码,或者您的代码包含可被用来破坏资源的 bug,它也无法损坏这些额外权限保护的资源。您只应该请求代码需要的那些权限,而不应请求更多权限。

  • 请求权限可使管理员知道应用程序需要的最小权限,从而使他们可以相应地调整安全策略。管理员可以使用权限查看工具 (Permview.exe) 来检查程序集并设置安全策略以发出必需的权限。如果您不显式请求应用程序需要的权限,则“权限查看”工具无法返回任何有关应用程序需要的权限的信息。如果管理员不知道此信息,则将很难管理您的应用程序。

请求权限会通知运行库应用程序正常运行需要哪些权限,或具体不需要哪些权限。例如,如果应用程序在不使用独立存储的情况下向本地硬盘写入数据,则应用程序必须拥有 FileIOPermission。如果代码不请求 FileIOPermission,而且本地安全设置不允许应用程序拥有此权限,则会在应用程序尝试向磁盘写入时引发安全性异常。即使应用程序能够处理此异常,也不会允许它向磁盘写入。如果您的应用程序是文本编辑程序,而用户已经使用了很长一段时间,则此行为会使用户很失望。另一方面,如果应用程序请求 FileIOPermission,而本地安全设置不允许您的应用程序拥有 FileIOPermission,则应用程序将在启动时生成异常,用户不会遇到丢失任何工作的问题。另外,如果您的应用程序请求 FileIOPermission 并且它是受信任的应用程序,则管理员可以调整安全策略来允许它从远程共享执行。

如果您的代码不访问受保护的资源或执行受保护的操作,则不必请求任何权限。例如,如果代码只根据向它传递的输入来计算结果而不使用任何资源,则可能不必请求权限。如果您的代码访问受保护的资源但未请求必要的权限,则仍可能允许它执行,但如果它尝试访问某种资源而它没有必要的权限,则可能在执行过程中某一处失败。

若要请求权限,必须知道代码将使用哪些资源和受保护的操作,而且还需要知道这些资源和操作有哪些权限保护。此外,还需要知道您的组件调用的所有类库方法访问的所有资源。有关 .NET Framework 附带的代码访问权限的列表,请参见权限主题。

下表描述权限请求的类型。

权限请求

说明

最小权限 (RequestMinimum)

您的代码要运行必须拥有的权限。

可选的权限 (RequestOptional)

您的代码可以使用的权限,但在没有这些权限时代码仍可有效运行。此请求隐式拒绝未明确请求的所有其他权限。

拒绝的权限 (RequestRefuse)

您要确保永远不授予您的代码的权限(即使安全策略允许将它们授予您的代码)。

对内置权限集执行上述任何请求(请求内置权限集)。

内置的权限集包括:NothingExecutionFullTrustInternetLocalIntranetSkipVerification

对 XML 编码的权限集执行上述任何请求(请求 XML 编码的权限)。

所需权限集的 XML 表示形式(或者是包含 XML 编码的权限集的字符串,或者是包含编码的权限集的 XML 文件的位置)。

如果指定必要权限(使用 RequestMinimum),则会将安全策略允许的每个必要权限都授予代码。只有将代码需要的所有权限都授予代码后,才允许代码运行。

请求可选的权限而不同时请求必要权限,在某些情况下会严重限制授予程序集的权限。例如,假定安全策略通常会将与 Everything 命名权限集关联的权限授予“程序集 A”。如果“程序集 A”的开发人员请求权限 A 作为可选权限,而未请求任何必要权限,则要么授予“程序集 A”权限 A(如果安全策略允许),要么不授予它任何权限。

请参见

任务

如何:请求命名权限集的权限

概念

代码访问安全性基础知识

程序集清单

安全权限

请求 XML 编码的权限

安全策略

参考

FileIOPermission

SecurityAction.RequestMinimum

SecurityAction.RequestOptional

RequestRefuse

其他资源

代码访问安全性