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

Kal*_*son 28 c# security moq .net-4.0 autofac

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

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

Moq有一个单一的方法,GetObjectDataSecurityCritical属性标记.AutofacContrib.Moq具有AllowPartiallyTrustedCallers属性集,该属性是异常的来源.似乎不是添加SecurityRulesSecurityLevel为1 的属性,而是最好删除AllowPartiallyTrustedCallers属性.我相信这默认会使程序集SecurityTransparent,这可能是不够的(尽管AutofacContrib.Moq单元测试通过).

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

Tra*_*lig 37

你是对的:在.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显示有问题的方法是异常序列化机制(System.Exception上的ISerializable.GetObjectData)的覆盖,只有SecurityCritical代码才会调用,所以你甚至可能碰到如果您丢失APTCA并标记程序集SecurityCritical会有任何问题.

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

对不起,这不是简短的回答.不幸的是,安全性从未如此简单.:S