Security 如何从DataAnnotations.ValidationAttribute继承(它在.NET 4中的Visual Studio调试主机下显示为SecureCritical!)

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

我有一个[AllowPartiallyTrustedCallers]类库,其中包含System.DataAnnotations.ValidationAttribute的子类型。该库用于合同类型的WCF服务

在.NET2/3.5中,这种方法运行良好。但是,自.NET 4.0以来,在Visual Studio调试器中运行该服务的客户端会导致异常“继承安全规则被类型违反:'(ValidationAttribute的我的子类型)”。派生类型必须与基类型的安全可访问性相匹配或不易访问。“(System.TypeLoadException)

仅当满足以下所有条件时,才会出现此错误:

  • ValidationAttribute的子类位于AllowPartiallyTrustedCallers程序集中
  • 反射用于检查属性
  • Visual Studio宿主进程已启用(项目属性、调试选项卡上的复选框)
  • 基本上,在Visual Studio.NET 2010中:

    • 创建一个新的控制台项目
    • 添加对“System.ComponentModel.DataAnnotations”4.0.0.0的引用
    • 编写以下代码:

    • 按F5键,您将获得异常
    按Ctrl-F5(启动而不调试),一切正常无异常

    奇怪的是ValidationAttribute是否安全关键取决于您运行程序的方式(F5或Ctrl+F5)。如上面代码中的Console.WriteLine所示。但同样,其他属性(和类型?)也会出现这种情况

    现在问题…

    为什么从ValidationAttribute继承时会有这种行为,而从System.Attribute继承时却没有?(使用Reflector,我在ValidationAttribute类或其程序集上找不到特殊设置)

    我能做些什么来解决这个问题?如何使MyValidationAttribute继承AllowPartiallyTrustedCallers程序集中的ValidationAttribute,而不将其标记为SecurityCritical,仍然使用新的.NET 4 level 2安全模型,并且仍然使用VS.NET调试主机(或其他主机)工作

    非常感谢! 鲁迪

    为什么从ValidationAttribute继承时会有这种行为,而从System.Attribute继承时却没有?(使用Reflector,我在ValidationAttribute类或其程序集上找不到特殊设置)

    这是因为System.ComponentModel.DataAnnotations程序集是有条件的APTCA,即它被标记为以下属性

    [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中进行任何特殊配置,但使用属性的所有类也必须是关键类

    出于某种原因,该网站将文本发布到一个与我写作时页面上的问题完全不同的问题中——奇怪。

    IIS与任何事情都有什么关系?这是一个控制台应用程序。
    [assembly: AllowPartiallyTrustedCallers(PartialTrustVisibilityLevel = PartialTrustVisibilityLevel.NotVisibleByDefault)]