C# .NET 4、AllowPartiallyTrustedCallers属性和安全标记(如SecurityCritical)
我是新来的C#并且正在努力理解这个问题 为了补充一些细节,我目前正在尝试更新AutofacContrib.Moq以使用最新的Moq。对于.NET-3.5及以下版本,我做这件事没有问题。但是在.NET-4中,安全限制导致了许多安全异常 Moq有一个方法,C# .NET 4、AllowPartiallyTrustedCallers属性和安全标记(如SecurityCritical),c#,security,.net-4.0,moq,autofac,C#,Security,.net 4.0,Moq,Autofac,我是新来的C#并且正在努力理解这个问题 为了补充一些细节,我目前正在尝试更新AutofacContrib.Moq以使用最新的Moq。对于.NET-3.5及以下版本,我做这件事没有问题。但是在.NET-4中,安全限制导致了许多安全异常 Moq有一个方法,GetObjectData,它用属性标记。AutofacContrib.Moq具有作为异常源的属性集。似乎与其添加SecurityLevel为1的SecurityRules属性,不如删除AllowPartiallyTrustedCallers属性。
GetObjectData
,它用属性标记。AutofacContrib.Moq具有作为异常源的属性集。似乎与其添加SecurityLevel为1的SecurityRules
属性,不如删除AllowPartiallyTrustedCallers
属性。我认为这使得程序集安全性在默认情况下是透明的,这可能不够(尽管AutofacContrib.Moq单元测试通过)
目前我的主要问题是,目标为.NET-4的程序集是否应该使用AllowPartiallyTrustedCallers属性?但是,考虑到我还不能完全理解,在处理带有安全标记的程序集时应该考虑哪些细节?我是否需要直接或间接地在程序集使用的位置使用标记为
SecurityCritical
的安全属性来显式标记程序集?您是正确的:在.NET 4中,将APTCA保留在那里会使程序集安全性透明,这可能是导致您悲伤的原因
MSDN文章对.NET4中AllowPartiallyTrustedCallersAttribute的更改进行了很好的讨论和解释
具体而言:
AllowPartiallyTrustedCallers属性已更改。在v4中,它不再与链接需求有关。事实上,v2中签名库中存在的隐式链接需求已经消失。相反,v4中所有完全受信任的程序集在默认情况下都是SecurityCritical的
[snip/]
在v4中,APTCA的作用是从应用它的程序集中删除自动SecurityCritical行为
而且
由于AllowPartiallyTrustedCallers属性导致默认情况下整个程序集是安全透明的,因此程序集的作者必须将需要执行特权操作的方法明确标记为SecurityCritical或SecuritySafeCritical
(作者迈克·罗索(Mike Rousos)写的这篇文章写得很好。)
如果您要启动一个新的.NET 4库,最好还是坚持使用.NET 4安全模型,并在需要时使用适当的SecurityCritical、SecuritySafeCritical和SecurityTransparent属性。它们比旧的代码访问安全性更易于管理和理解
如果您要将旧库迁移到新模型,那么本文中有一个很好的示例说明如何做到这一点。。。但基本上,这相当于删除旧的链接需求,并在其位置添加[SecurityCritical]
在您的特定情况下,<>强>最快< /强>的方式是添加SuffyTyeRe规属性,这样您就可以得到旧的行为,但我不确定是否会考虑<强>右<强> >。正确的方法可能是丢失APTCA并在程序集上添加SecurityCritical,然后使用SecuritySafeCritical标记调用SecurityCritical代码的各种类型(例如,引用GetObjectData的内容),以便SecurityTransparent代码可以调用它。当然,第二种方法需要做更多的工作,因此您可能需要运行SecAnnotate.exe并获得一些自动提示
查看Moq主干,对GetObjectData的搜索显示所讨论的方法是对异常序列化机制(System.exception上的ISerializable.GetObjectData)的重写,无论如何,只有SecurityCritical代码才会调用该机制,因此,如果只是丢失了APTCA并将程序集SecurityCritical标记,您甚至可能不会遇到任何麻烦 如果你喜欢这个主意,就去投票/发表评论对不起,这不是一个简短的回答。不幸的是,安全从来都不容易答案很好,特拉维斯。。。不用抱歉:)。这是一个很棒的问答。我真是太感谢你了,特拉维斯。当我们从.NET3.5迁移到4.5时,我能够调试生产中的一个错误。我对问题和答案投了赞成票。