Security 如何从DataAnnotations.ValidationAttribute继承(它在.NET 4中的Visual Studio调试主机下显示为SecureCritical!)
我有一个[AllowPartiallyTrustedCallers]类库,其中包含System.DataAnnotations.ValidationAttribute的子类型。该库用于合同类型的WCF服务 在.NET2/3.5中,这种方法运行良好。但是,自.NET 4.0以来,在Visual Studio调试器中运行该服务的客户端会导致异常“继承安全规则被类型违反:'(ValidationAttribute的我的子类型)”。派生类型必须与基类型的安全可访问性相匹配或不易访问。“(System.TypeLoadException) 仅当满足以下所有条件时,才会出现此错误:Security 如何从DataAnnotations.ValidationAttribute继承(它在.NET 4中的Visual Studio调试主机下显示为SecureCritical!),security,.net-4.0,code-access-security,Security,.net 4.0,Code Access Security,我有一个[AllowPartiallyTrustedCallers]类库,其中包含System.DataAnnotations.ValidationAttribute的子类型。该库用于合同类型的WCF服务 在.NET2/3.5中,这种方法运行良好。但是,自.NET 4.0以来,在Visual Studio调试器中运行该服务的客户端会导致异常“继承安全规则被类型违反:'(ValidationAttribute的我的子类型)”。派生类型必须与基类型的安全可访问性相匹配或不易访问。“(System.T
- 创建一个新的控制台项目
- 添加对“System.ComponentModel.DataAnnotations”4.0.0.0的引用
- 编写以下代码:
- 按F5键,您将获得异常李>
[assembly: AllowPartiallyTrustedCallers(PartialTrustVisibilityLevel = PartialTrustVisibilityLevel.NotVisibleByDefault)]
Visual Studio启动主机进程的方式导致CLR不尊重此程序集上的APTCA,即使默认的AppDomain是完全受信任的。这意味着DataAnnotations程序集中的所有类型和方法都是安全关键的。由于安全透明类型(MyValidationAttribute)无法从安全关键类型(ValidationAttribute)继承,因此会引发此异常
我能做些什么来解决这个问题?如何使MyValidationAttribute继承AllowPartiallyTrustedCallers程序集中的ValidationAttribute,而不将其标记为SecurityCritical,仍然使用新的.NET 4 level 2安全模型,并且仍然使用VS.NET调试主机(或其他主机)工作
这似乎是VS主机的一个bug,这对于您的情况来说是不幸的。另一方面,您应该确保您希望您的程序集是APTCA。如果有必要,那么你有两个选择
- 您可以让程序集保持原样。这是有利的,因为在最典型的部分信任环境ASP.NET中,DataAnnotations程序集始终被视为APTCA。当然,您将无法在VS宿主进程中使用调试器
- 也可以将部件标记为C-APTCA。您将能够在VS宿主进程中使用调试器,但是ASP.NET中程序集的使用者需要将程序集添加到web.config中的元素中,以便它成为APTCA
- 您可以使属性SecurityCritical,这样您就可以使用调试器,并且不需要在ASP.NET中进行任何特殊配置,但使用属性的所有类也必须是关键类
[assembly: AllowPartiallyTrustedCallers(PartialTrustVisibilityLevel = PartialTrustVisibilityLevel.NotVisibleByDefault)]