覆盖成员时违反了继承安全规则 - SecurityRuleSet.Level2

时间:2010-06-16 17:41:12

标签: .net security

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

  

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

我认为这个问题是由于我正在重写GetObjectData。

我知道解决问题的一个答案是设置SecurityRuleSet:

[assembly: SecurityRules(SecurityRuleSet.Level1)]

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

5 个答案:

答案 0 :(得分:35)

GetObjectData标记为SecurityCriticalAttribute,因为它已应用于Exception.GetObjectData。被覆盖的成员应具有相同的安全可访问性(严重,安全关键或透明)。

有关详细信息,请阅读MSDN中的Security Changes in the .NET Framework 4Security Transparent Code, Level 2

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

答案 1 :(得分:20)

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

[assembly: System.Security.AllowPartiallyTrustedCallers]

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

答案 2 :(得分:11)

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

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

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

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

答案 3 :(得分:1)

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

旁白:也许我没有通过在我的项目中包含库来遵循最佳实践。如果是这种情况,我会欢迎有关不同方法的反馈,以及每种选择的利弊。我目前的想法是,如果有错误,能够看到库的源代码将帮助我理解库的期望,这将帮助我清除错误。此外,看看其他人如何编写源代码,如果不是有价值的学习经验,那就没什么。基本上,我试图遵循Jeff Atwood的建议here。但是,如果有更好的方法来实现这一目标,我会全力以赴。

答案 4 :(得分:0)

我遇到了这个错误,这对我的情况毫无意义! 我使用了一个简单的示例https://www.c-sharpcorner.com/article/using-autofac-with-web-api

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

也许这可以节省一些人的无用调查时间。