安全透明程序集不应包含安全关键代码

更新:2007 年 11 月

TypeName

SecurityTransparentAssembliesShouldNotContainSecurityCriticalCode

CheckId

CA2127

类别

Microsoft.Security

是否重大更改

原因

在完全透明的程序集中不能发生关键代码。

规则说明

此规则分析完全透明的程序集,查找类型、字段和方法级别是否有任何 SecurityCritical 批注。此规则很有用,因为它标记存在于完全透明的程序集中的代码。完全透明的程序集中的代码在运行时触发安全异常或意外行为。

.NET Framework 2.0 引入了一个称为“透明度”的功能。各个方法、字段、接口、类和类型都可以是透明或关键的。

不允许透明代码提升安全特权。因此,授予透明代码或其请求的任何权限都会自动通过该代码传递给调用方或主机 AppDomain。“提升”的示例包括 Assert、LinkDemand、SuppressUnmanagedCode 和“不安全的”代码。

程序集可以是完全透明、完全关键或者混合透明/关键。

若要将程序集标记为完全透明,请添加下列程序集级属性:

 [assembly:System.Security.SecurityTransparent]

若要将程序集标记为完全关键,请添加下列程序集级属性:

[assembly:System.Security.SecurityCritical(System.Security.SecurityCriticalScope.Everything)]

若要将程序集标记为混合透明/关键,请添加下列程序集级属性:

 [assembly:System.Security.SecurityCritical]

透明代码不能出现在完全关键的程序集中,关键代码也不能出现在完全透明的程序集中。

如何修复冲突

若要解决此问题,请将程序集标记为混合透明/关键,或者从标记的代码中移除 SecurityCritical 属性。

何时禁止显示警告

不要禁止显示此规则发出的消息。