【问题标题】:Inheritance security rules violated while overriding member - SecurityRuleSet.Level2覆盖成员时违反继承安全规则 - SecurityRuleSet.Level2
【发布时间】:2011-03-04 14:29:07
【问题描述】:

我有一个继承自 Exception 的类。在 .NET 4 中,我开始收到运行时错误:

违反了继承安全规则 而覆盖成员:MyBusinessException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'。安全 覆盖方法的可访问性 必须与安全可访问性相匹配 被覆盖的方法。

我认为问题是由于我正在覆盖 GetObjectData。

我知道解决问题的一个方法是设置 SecurityRuleSet:

[assembly: SecurityRules(SecurityRuleSet.Level1)]

这不是一个可接受的答案,我想知道如何解决这个问题,而不必放松 .NET 4 中的默认安全规则。

【问题讨论】:

    标签: .net security


    【解决方案1】:

    SecurityCriticalAttribute 标记GetObjectData,因为它应用于Exception.GetObjectData。被覆盖的成员应具有相同的安全可访问性(Critical、Safe Critical 或 Transparent)。

    阅读 MSDN 中的 Security Changes in the .NET Framework 4Security Transparent Code, Level 2 了解更多信息。

    为避免所有潜在的安全运行时异常,请使用安全规则集启用代码分析。您将收到可能与运行时错误相对应的静态分析警告。

    【讨论】:

    • 酷,成功了!我实际上已经尝试过了,但是我在类级别而不是成员级别应用了该属性。
    • 我正在尝试在 InitializeLifeTimeService 上执行此操作,但它不想工作,得到同样的错误。
    • @brainmurphy1:只需在方法声明前添加[SecurityCritical]
    • 在使用 NHibernate 4.1.0 从 Antlr3 获取它的发布模式下运行 asp.net 应用程序时遇到了类似的问题,此信息为我指明了正确的方向,即获取具有 SecurityCriticalAttribute 的更新的 Antlr 源,谢谢!
    【解决方案2】:

    当我调用具有 AllowPartiallyTrustedCallers 属性的程序集时遇到此问题:

    [assembly: System.Security.AllowPartiallyTrustedCallers]
    

    删除它解决了我的问题,而无需切换到 SecurityRuleSet.Level1。

    【讨论】:

    • 这是一个快速而肮脏的修复程序,用于编译 DevExpress 源代码。
    • 这将包含在 AssemblyInfo.cs 中,至少对我来说是这样。摆脱它也为我解决了这个问题。
    【解决方案3】:

    关于允许完全信任应用程序的共享主机环境中的此错误。当你 bin 部署应用程序时,你经常会覆盖 web.config。在 IIS 下,当您将信任设置更改为与默认设置不同的设置时,您的 Web 配置部分将修改为:

    <system.web>
        <trust level="Full" />
    <system.web>
    

    在部署期间复制新的 web.config 通常会覆盖此设置,但是 IIS 管理员仍会将站点显示为“完全信任”,而实际上该站点运行在您的共享主机提供商的默认信任级别(通常中等)。

    您将看到此错误并执行我所做的操作 - 尝试弄清楚为什么您会看到它,即使您知道该站点在完全信任下运行,但实际上并非如此。解决方案是在部署之前修改您的 web 配置,或者使用 IIS Admin 将站点设置为不同的信任级别(例如,高),应用它,然后将其设置回完整。这样做会重新插入必要的配置文件信息并以完全信任的方式重新启动应用程序池。

    【讨论】:

      【解决方案4】:

      对我来说,问题出在 log4net 库上。我下载了源代码,并将项目文件添加到我的解决方案中,以便我可以进入外部库。但是,log4net 需要为条件编译定义 NET_4_0 符号。默认情况下,它定义了NET_1_0。我进入 log4net 项目属性并将NET_1_0 更改为NET_4_0,这解决了问题。

      旁白:也许我没有在我的项目中包含库来遵循最佳实践。如果是这种情况,我欢迎就不同的方法以及每种选择的优缺点提供反馈。我目前的想法是,如果出现错误,能够查看库的源代码将帮助我了解库的期望,这将帮助我清除错误。此外,看看其他人是如何编写源代码的,如果不是宝贵的学习经验,那也算不了什么。基本上,我正在尝试遵循发现 here 的 Jeff Atwood 的建议。但如果有更好的方法来实现这一点,我会全力以赴。

      【讨论】:

        【解决方案5】:

        我遇到了这个对我的情况没有意义的错误! 我用了这个简单的例子https://www.c-sharpcorner.com/article/using-autofac-with-web-api

        问题是我没有空间并且没有注意到它,所以我通过在驱动器上腾出空间来解决这个问题。

        也许这可以为某人节省几个小时的无用调查。

        【讨论】:

          猜你喜欢
          • 2016-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-09
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          相关资源
          最近更新 更多