代码访问安全策略兼容性和迁移

.NET Framework 4 版已经弃用代码访问安全性 (CAS) 的策略部分。 因此,如果显式或隐式(通过其他类型和成员)调用过时的策略类型和成员,则可能遇到编译警告和运行时异常。

通过以下方式之一可避免警告和错误:

本主题包含以下各节:

  • 显式使用

  • 隐式使用

  • 错误和警告

  • 迁移:替换已过时的调用

  • 兼容性:使用 CAS 策略旧版选项

显式使用

那些直接操作安全策略或需要 CAS 策略进行沙盒处理的成员均已过时,默认情况下将产生错误。

这些成员包括:

隐式使用

有些程序集加载的重载会由于隐式使用 CAS 策略而产生错误。 这些重载采用 Evidence 参数,该参数用于解析 CAS 策略并为程序集提供权限授予集。

下面是一些示例。 已过时的重载指那些采用 Evidence 作为参数的重载:

错误和警告

使用已过时的类型和成员会产生以下错误消息。 请注意,System.Security.Policy.Evidence 类型本身并未过时。

编译时警告:

warning CS0618: '<API Name>' is obsolete: 'This method is obsolete and will be removed in a future release of the .NET Framework. Please use <suggested alternate API>. See <link> for more information.'

运行时异常:

NotSupportedException: This method uses CAS policy, which has been obsoleted by the .NET Framework. In order to enable CAS policy for compatibility reasons, please use the <NetFx40_LegacySecurityPolicy> configuration switch. Please see <link> for more information.

迁移:替换已过时的调用

确定程序集的信任级别

CAS 策略通常用于确定程序集或应用程序域的权限授予集或信任级别。 .NET Framework 4 公开以下有用的属性,它们不需要解析安全策略:

应用程序域沙盒

AppDomain.SetAppDomainPolicy 方法通常用于对应用程序域中的程序集进行沙盒处理。 .NET Framework 4 公开不需要为此目的而使用 PolicyLevel 的成员。有关更多信息,请参见如何:运行沙盒中部分受信任的代码

确定部分受信任代码的安全或合理的权限集。

主机通常需要确定适合沙盒所承载的代码的权限。 在 .NET Framework 4 之前,CAS 策略通过 SecurityManager.ResolvePolicy 方法为完成此步骤提供了一种方式。 .NET Framework 4 提供了 SecurityManager.GetStandardSandbox 方法作为替代,该方法可为提供的证据返回安全的标准权限集。

非沙盒方案:程序集加载的重载

使用程序集加载重载而不是对程序集进行沙盒处理的原因,可能是为了使用其他情况下不可用的参数。 从 .NET Framework 4 开始,不需要使用 System.Security.Policy.Evidence 对象作为参数的程序集加载重载(例如,AppDomain.ExecuteAssembly(String, String>, Byte>, AssemblyHashAlgorithm))使这种方案成为可能。

如果需要对程序集进行沙盒处理,请使用 AppDomain.CreateDomain(String, Evidence, AppDomainSetup, PermissionSet, StrongName>) 重载。

兼容性:使用 CAS 策略旧版选项

使用 <NetFx40_LegacySecurityPolicy> 配置元素可指定进程或库使用旧版 CAS 策略。 启用此元素后,策略和证据重载将像在之前的 Framework 版本中一样工作。

注意注意

CAS 策略行为是基于运行时版本指定的,因此修改某个运行时版本的 CAS 策略不会影响其他版本的 CAS 策略。

<configuration>
   <runtime>
      <NetFx40_LegacySecurityPolicy enabled="true"/>
   </runtime>
</configuration>

请参见

任务

如何:运行沙盒中部分受信任的代码