安全权限
公共语言运行时允许代码仅执行它有权执行的操作。 运行时使用称为权限的对象对托管代码强制实施限制。 运行时在若干命名空间中提供了内置权限类,还提供了对设计和实现自定义权限类的支持。
有两种权限,每一种权限都有特定的用途:
代码访问权限,此类权限表示对受保护资源的访问权限,或执行受保护操作的能力。
基于角色的安全性权限,此类权限提供一种判别机制,用以确定用户(或代表用户执行操作的代理)是否具有特定的身份,或是否为指定角色的成员。 PrincipalPermission是唯一一个基于角色的安全权限。
安全权限的形式可以是权限类(命令性安全),也可以是表示权限类的特性(声明性安全)。 安全权限的基类为 System.Security.CodeAccessPermission;安全权限特性的基类为 System.Security.Permissions.CodeAccessSecurityAttribute。
程序集形式的应用程序在加载到应用程序域时,将被授予一组特定权限。 通常使用由 SecurityManager.GetStandardSandbox 方法确定的预定义权限集执行授予操作。 授予集确定可授予代码的权限。 运行时基于代码的原始位置(例如,本地计算机、本地 Intranet 或 Internet)授予权限。 如果将代码加载到沙盒,还可以授予该代码特殊权限。 有关在沙盒中运行代码的更多信息,请参见如何:运行沙盒中部分受信任的代码。
权限的主要用途如下:
库代码可要求其调用方必须拥有特定权限。 如果您在代码中针对某项权限设置了 Demand,则使用该代码的所有代码都必须拥有该权限才能运行。 可以使用这样的要求来确定调用方是否有权访问特定资源,或者确定调用方的身份。
代码可以使用权限来拒绝对其要保护的资源的访问。 可以使用 SecurityAction.PermitOnly 指定受限的权限集,以便显式拒绝其他所有权限。 但是,不建议为了防范故意误用而使用 PermitOnly 禁止访问。 在其授予集中具有隐式拒绝权限的已调用程序集可以重写被拒绝的权限,方法是对这些程序集希望使用的任何权限执行 SecurityAction.Assert。 例如,如果您仅允许 UIPermission 并调用了本身具有 FileIOPermission 的程序集,则该程序集只需对 FileIOPermission 进行 Assert,并执行文件操作。 若要防止所引用程序集中不受信任的代码访问资源,唯一可靠的方法是,使用不包含这些权限的授予集执行该代码。