我是 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/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha