我是新的C#,我正在尝试理解new security features of .NET-4。
要填写一些细节,我目前正在尝试更新AutofacContrib.Moq以使用最新的Moq。对于.NET-3.5及以下版本,我没有遇到任何问题。但在.NET-4中,安全限制会导致许多安全例外。
Moq有一个方法GetObjectData
,标有SecurityCritical属性。 AutofacContrib.Moq具有AllowPartiallyTrustedCallers属性集,它是异常的来源。似乎不是添加SecurityLevel为1的SecurityRules
属性,而是最好删除AllowPartiallyTrustedCallers
属性。我相信这会默认使用程序集SecurityTransparent,这可能不够(尽管AutofacContrib.Moq单元测试通过)。
目前我的主要问题是,针对.NET-4的程序集是否应该使用AllowPartiallyTrustedCallers属性?但是,鉴于我绝对不了解所有内容,在使用安全标记的程序集时应该考虑哪些细节?我是否需要在其使用的地方使用安全属性明确标记我的程序集,直接或间接地标记SecurityCritical
?
答案 0 :(得分:37)
你是对的:在.NET 4中,将APTCA留在那里使得程序集SecurityTransparent,这可能是导致你悲伤的原因。
MSDN文章Migrating an APTCA Assembly to the .NET Framework 4对.NET 4中AllowPartiallyTrustedCallersAttribute的更改进行了很好的讨论和解释。
具体做法是:
AllowPartiallyTrustedCallers属性已更改。在第4版中,它不再与链接需求有任何关系。事实上,v2中签名库中存在的隐式链接需求已经消失。相反,v4中的所有完全受信任的程序集默认为SecurityCritical。
[snip /]
在第4节中,APTCA的作用是从应用它的程序集中删除自动SecurityCritical行为。
和...
由于AllowPartiallyTrustedCallers属性默认情况下导致整个程序集为SecurityTransparent,因此程序集的作者必须专门将需要执行特权操作的方法标记为SecurityCritical或SecuritySafeCritical。
(这是一篇很好的文章,作者Mike Rousos做得很好。I encourage you to read it in its entirety.)
如果您要启动新的.NET 4库,最好坚持使用.NET 4安全模型,并在需要时使用适当的SecurityCritical,SecuritySafeCritical和SecurityTransparent属性。与旧的代码访问安全性相比,它们更容易管理和理解。
如果您正在将旧库迁移到新模型,那么在文章中有一个很好的示例如何做到这一点......但基本上它等于删除旧的LinkDemands并在其位置添加[SecurityCritical]。
在您的特定情况下,最快方式将是添加SecurityRules属性以便您获得旧行为,但我不确定我是否会考虑对,方式。正确的方法可能是丢失APTCA并在程序集because the assembly may contain SecurityCritical code上添加SecurityCritical,然后使用SecuritySafeCritical标记调用SecurityCritical代码的各种类型(例如,引用GetObjectData的内容),以便SecurityTransparent代码可以调用它。当然,第二种方法将会有更多工作,因此您可能希望运行SecAnnotate.exe并获得一些自动提示。
查看Moq主干,搜索GetObjectData显示有问题的方法是异常序列化机制(System.Exception上的ISerializable.GetObjectData)的覆盖,只有SecurityCritical代码才会调用,所以你可能不会如果您丢失APTCA并标记程序集SecurityCritical,即使遇到任何麻烦。
There is an issue filed on Autofac to update it to the latest security model.如果您喜欢这个想法,请对其进行投票/评论。
很抱歉这不是简短的回答。不幸的是,安全性从未如此简单。 :S