代码访问安全策略兼容性和迁移
.NET Framework 4 版已经弃用代码访问安全性 (CAS) 的策略部分。 因此,如果显式或隐式(通过其他类型和成员)调用过时的策略类型和成员,则可能遇到编译警告和运行时异常。
通过以下方式之一可避免警告和错误:
迁移到已过时的调用在 .NET Framework 4 中的替代项。
- 或 -
使用 <NetFx40_LegacySecurityPolicy> 配置元素选择使用旧版 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>