Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET 4、AllowPartiallyTrustedCallers属性和安全标记(如SecurityCritical)_C#_Security_.net 4.0_Moq_Autofac - Fatal编程技术网

C# .NET 4、AllowPartiallyTrustedCallers属性和安全标记(如SecurityCritical)

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属性。

我是新来的C#并且正在努力理解这个问题

为了补充一些细节,我目前正在尝试更新AutofacContrib.Moq以使用最新的Moq。对于.NET-3.5及以下版本,我做这件事没有问题。但是在.NET-4中,安全限制导致了许多安全异常

Moq有一个方法,
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时,我能够调试生产中的一个错误。我对问题和答案投了赞成票。