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

Pag*_*age 47 .net security

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

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

我认为问题是由于我重写了GetObjectData.

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

[assembly: SecurityRules(SecurityRuleSet.Level1)]
Run Code Online (Sandbox Code Playgroud)

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

Jul*_*ain 35

马克GetObjectDataSecurityCriticalAttribute,因为它的应用Exception.GetObjectData.被覆盖的成员应具有相同的安全可访问性(严重,安全关键或透明).

阅读在.NET Framework 4中的安全性更改安全透明的代码,级别2从MSDN以获取更多信息.

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

  • 很酷,真有效!我实际上已经尝试过这个,但我在类级别而不是在成员级别应用了该属性. (3认同)

Ved*_*ran 20

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

[assembly: System.Security.AllowPartiallyTrustedCallers]
Run Code Online (Sandbox Code Playgroud)

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

  • 这将包含在AssemblyInfo.cs中,至少对我而言.摆脱它也解决了它. (4认同)

Joe*_*ger 12

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

<system.web>
    <trust level="Full" />
<system.web>
Run Code Online (Sandbox Code Playgroud)

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

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