.NET 4,AllowPartiallyTrustedCallers属性和SecurityCritical等安全标记

时间:2011-02-20 06:32:06

标签: c# security .net-4.0 moq autofac

我是新的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

1 个答案:

答案 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