c# - .NET 4、AllowPartiallyTrustedCallers 属性和 SecurityCritical 等安全标记

标签 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 的那些地方用安全属性明确标记它?

最佳答案

您是对的:在 .NET 4 中,将 APTCA 保留在那里会使程序集 SecurityTransparent,这可能是让您感到悲伤的原因。

MSDN 文章 Migrating an APTCA Assembly to the .NET Framework 4对 .NET 4 中 AllowPartiallyTrustedCallersAttribute 的更改进行了很好的讨论和解释。

具体来说:

The AllowPartiallyTrustedCallers attribute has changed. In v4, it no longer has anything to do with link demands. In fact, the implicit link demand that was present on signed libraries in v2 is gone. Instead, all fully trusted assemblies in v4 are, by default, SecurityCritical.

[snip /]

In v4, the effect of APTCA is to remove the automatic SecurityCritical behavior from the assembly to which it’s applied.

还有……

Because the AllowPartiallyTrustedCallers attribute causes the entire assembly to be SecurityTransparent by default, the assembly’s author must specifically mark methods needing to perform privileged operations as SecurityCritical or SecuritySafeCritical.

(这真是一篇好文章,作者 Mike Rousos 写得很好。I encourage you to read it in its entirety.)

如果您开始使用新的 .NET 4 库,最好坚持使用 .NET 4 安全模型并在需要时使用适当的 SecurityCritical、SecuritySafeCritical 和 SecurityTransparent 属性。它们比旧代码访问安全性更易于管理和理解。

如果您要将旧库迁移到新模型,文章中有一个很好的示例说明如何执行此操作...但基本上这相当于删除旧的 LinkDemands 并在其位置添加 [SecurityCritical]。

在您的特定情况下,最快 开始的方法是添加 SecurityRules 属性,以便您获得旧的行为,但我不确定我是否认为 正确的方式。正确的方法可能是丢失 APTCA 并在程序集上添加 SecurityCritical because the assembly may contain SecurityCritical code ,然后用 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

关于c# - .NET 4、AllowPartiallyTrustedCallers 属性和 SecurityCritical 等安全标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5055632/

相关文章:

c# - 如何与USB 3G调制解调器通信?

c - 保护 RAM 中的加密 key ?

c# - BlockingCollection.TakeFromAny 方法是否适合构建阻塞优先级队列?

c# - 使用不区分大小写的字符串比较器初始化字典时序列化 Dictionary<string, object>

c# - 通过属性设置 Treeview HierarchicalDataTemplate

c# - Ws-Federation 身份信息在 Web API 中不可用?

c# - 动态确定不同类的函数返回类型?

java - x-power-by 在响应 header 中显示

security - Paypal "Security header is not valid"错误。怎么办?

.NET 4.0 有一个新的 GAC,为什么?