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

我是新的C#,我正在尝试了解.NET-4的新安全function 。

为了填写一些细节,我目前正在尝试更新AutofacContrib.Moq以使用最新的Moq。 对于.NET-3.5及以下版本,我没有遇到任何问题。 但在.NET-4中,安全限制会导致许多安全exception。

Moq有一个单独的方法GetObjectData ,它标有SecurityCritical属性。 AutofacContrib.Moq具有AllowPartiallyTrustedCallers属性集,该属性是exception的来源。 似乎不是添加SecurityRules属性为1的SecurityRules属性,而是最好删除AllowPartiallyTrustedCallers属性。 我相信这会默认使用程序集SecurityTransparent,这可能是不够的(尽管AutofacContrib.Moqunit testing通过)。

我目前的主要问题是,针对.NET-4的程序集是否应该使用AllowPartiallyTrustedCallers属性? 但是,鉴于我绝对不了解所有内容,在使用安全标记的程序集时应该考虑哪些细节? 我是否需要在其使用的地方使用安全属性明确标记我的程序集,直接或间接地标记为SecurityCritical

你是对的:在.NET 4中,将APTCA留在那里使得程序集SecurityTransparent,这可能是导致你悲痛的原因。

MSDN文章将APTCA程序集迁移到.NET Framework 4 ,可以很好地讨论和解释.NET 4中AllowPartiallyTrustedCallersAttribute的更改。

特别:

AllowPartiallyTrustedCallers属性已更改。 在第4版中,它不再与链接需求有任何关系。 事实上,v2中签名库中存在的隐式链接需求已经消失。 相反,v4中的所有完全受信任的程序集默认为SecurityCritical。

[snip /]

在第4节中,APTCA的作用是从应用它的程序集中删除自动SecurityCritical行为。

和…

由于AllowPartiallyTrustedCallers属性默认情况下导致整个程序集为SecurityTransparent,因此程序集的作者必须专门将需要执行特权操作的方法标记为SecurityCritical或SecuritySafeCritical。

(这是一篇很好的文章,作者Mike Rousos做得很好。 我鼓励你全文阅读。 )

如果您正在启动一个新的.NET 4库,最好坚持使用.NET 4安全模型,并在需要时使用适当的SecurityCritical,SecuritySafeCritical和SecurityTransparent属性。 与旧的代码访问安全性相比,它们更容易管理和理解。

如果您正在将旧库迁移到新模型,那么在文章中有一个很好的例子如何做到这一点……但基本上它等于删除旧的LinkDemands并在其位置添加[SecurityCritical]。

在您的特定情况下, 最快的方法是添加SecurityRules属性,以便获得旧的行为,但我不确定我是否认为这是正确的方法。 正确的方法可能是丢失APTCA并在程序集上添加SecurityCritical, 因为程序集可能包含SecurityCritical代码 ,然后使用SecuritySafeCritical标记调用SecurityCritical代码的各种类型(例如,引用GetObjectData的东西),以便SecurityTransparent代码可以调用它。 当然,第二种方法将会有更多的工作,所以你可能想要运行SecAnnotate.exe并获得一些自动提示。

查看Moq主干,搜索GetObjectData显示有问题的方法是exception序列化机制(System.Exception上的ISerializable.GetObjectData)的覆盖,只有SecurityCritical代码才会调用,所以你甚至可能碰到如果你失去APTCA并标记程序集SecurityCritical会有任何麻烦。

Autofac上存在一个问题,要将其更新为最新的安全模型。 如果您喜欢这个想法,请对其进行投票/评论。

对不起,这不是一个简短的答案。 不幸的是,安全绝非易事。 :S