安全透明的代码

安全性涉及三个交互部分:沙盒、权限和强制。 沙盒是指创建独立域的做法,在独立域中,一些代码被视为完全信任的,而其他代码限制为沙盒的授予集中的权限。 在沙盒的授予集内运行的应用程序代码被视为透明的;也就是说,此代码不能执行影响安全的任何操作。 沙盒的授予集由证据决定。 证据可标识沙盒所需的特定权限以及能够创建的沙盒类型。 强制是指允许透明代码仅在其授予集内执行。

重要说明重要事项

安全策略是 .NET Framework 的早期版本中的一个关键元素。从 .NET Framework 4 版开始,安全策略已过时。安全策略的取消与安全透明度是分离的。有关此更改的影响和缓解建议的信息,请参见代码访问安全策略兼容性和迁移

本主题更详细地描述了透明度模型。 它包含下列部分:

  • 透明度模型的用途

  • 指定透明度级别

  • 透明度强制

透明度模型的用途

透明度是一种强制机制,它可将作为应用程序的一部分运行的代码与作为基础结构的一部分运行的代码分离。 透明度在可以执行特权操作(例如调用方本机代码)的代码(关键代码)与不可执行特权操作的代码(透明代码)之间设置了一个屏障。 透明代码可以在其运行于的权限集的边界内执行命令,但无法执行、派生自或包含关键代码。

透明度强制的主要目的是为了提供用于基于特权隔离不同的代码组的简单而有效的机制。 在沙盒模型的上下文中,这些特权组要么是完全受信任的(即不受限制),要么是部分受信任的(即限于授予给沙盒的权限集)。

重要说明重要事项

透明度模型优于代码访问安全性。透明度是由实时编译器强制执行的,并且无论程序集的授予集如何(包含完全信任),它始终保持有效。

.NET Framework 2.0 版中引入了透明度,旨在简化安全模型,以便能够更轻松地编写和部署安全库和应用程序。 Microsoft Silverlight 中也使用了透明代码,旨在简化针对部分信任的应用程序的开发过程。

注意注意

在开发部分信任的应用程序时,您必须了解目标主机的权限要求。您可能会开发使用某些主机不允许的资源的应用程序。虽然此应用程序在编译时不会出错,但在将其加载到宿主环境中时将失败。如果已使用 Visual Studio 开发应用程序,则可以以部分信任权限或在开发环境中的受限权限集中启用调试。有关更多信息,请参见如何:使用受限权限对 ClickOnce 应用程序进行调试。为 ClickOnce 应用程序提供的“计算权限”功能也可用于任何部分信任的应用程序。

返回页首

指定透明度级别

程序集级别的 SecurityRulesAttribute 特性显式选择程序集将遵循的 SecurityRuleSet 规则。 这些规则在一个数字级别系统中进行组织,级别越高表示安全规则的强制性越高。

各个级别如下:

  • 2 级 (Level2) – .NET Framework 4 透明度规则。

  • 1 级 (Level1) – .NET Framework 2.0 透明度规则。

这两个透明度级别之间的主要差异在于,1 级透明度不会对来自程序集外部的调用强制执行透明度规则,而仅用于实现兼容性。

重要说明重要事项

应仅为实现兼容性指定 1 级透明度;也就是说,仅为使用 .NET Framework 3.5 或以前的版本(使用 AllowPartiallyTrustedCallersAttribute 特性或不使用透明度模型)开发的代码指定 1 级透明度。例如,为允许来自部分信任的调用方 (APTCA) 的调用的 .NET Framework 2.0 程序集使用 1 级透明度。为 .NET Framework 4 开发的代码始终使用 2 级透明度。

2 级透明度

.NET Framework 4 版中引入了 2 级透明度。 此模型的三个原则是透明代码、安全可靠关键代码和安全关键代码。

  • 透明代码只能调用其他透明代码或安全可靠关键代码,而无论授予它的权限如何(包括完全信任)。 如果代码是部分信任的,则它只能执行域的权限集所允许的操作。 透明代码不能执行以下操作:

    • 执行 Assert 操作或特权提升。

    • 包含不安全的代码或无法验证的代码。

    • 直接调用关键代码。

    • 调用本机代码或具有 SuppressUnmanagedCodeSecurityAttribute 特性的代码。

    • 调用受 LinkDemand 保护的成员。

    • 从关键类型继承。

    此外,透明方法不能重写关键虚方法,也不能实现关键接口方法。

  • 安全可靠关键代码是完全受信任的,而透明代码可以调用它。 它公开完全信任代码的有限外围应用。 正确性和安全验证是在安全关键代码中进行的。

  • 安全关键代码是完全受信任的,它可以调用任何代码,但透明代码无法调用它。

1 级透明度

.NET Framework 2.0 版中引入了 1 级透明度模型,旨在使开发人员能够减少受安全审核限制的代码的数量。 虽然 1 级透明度在 2.0 版中是公用的,但它主要在 Microsoft 内部仅出于安全审核的目的使用。 利用批注,开发人员可以声明哪些类型和成员可以执行安全提升和其他受信任操作(安全关键),哪些不能执行这些操作(安全透明)。 标识为透明的代码不需要严格的安全审核。 1 级透明度指出透明度强制限定为在程序集内执行。 换句话说,标识为安全关键的任何公共类型或成员仅在程序集内是安全关键的。 如果希望在从程序集的外部调用这些类型和成员时强制其安全性,则必须使用完全信任的链接要求。 如果不这样做,则公开可见的安全关键类型和成员将被视为是安全可靠关键的,并且可以由程序集外部的部分信任的代码调用。

1 级透明度模型具有以下限制:

  • 可从安全透明代码访问公共的安全关键类型和成员。

  • 仅在程序集内强制进行透明度批注。

  • 安全关键类型和成员必须使用链接要求以强制来自程序集外部的调用的安全性。

  • 不强制执行继承规则。

  • 在以完全信任模式运行时,透明代码可能会执行有害操作。

返回页首

透明度强制

在计算透明度之前,不会强制执行透明度规则。 在这种情况下,如果违反了透明度规则,则将引发 InvalidOperationException。 计算透明度的时间由多个因素决定,并且无法进行预测。 应尽可能晚地计算透明度。 在 .NET Framework 4 中,计算程序集级别透明度的时间早于 .NET Framework 2.0 中计算程序集级别透明度的时间。唯一可以确保的是,透明度计算将在需要时发生。 这与实时 (JIT) 编译器可以更改编译某个方法并检测该方法中的任何错误的时间的方式类似。 如果代码未发生任何透明度错误,则透明度计算是不可见的。

返回页首

请参见

概念

安全透明的代码,级别 1

安全透明的代码,级别 2