.net 如何有效地为部分信任编写F#程序集?

.net 如何有效地为部分信任编写F#程序集?,.net,f#,code-access-security,.net,F#,Code Access Security,有人在部分信任场景中使用过F#代码吗?与中一样,使用[)创建程序集。实际上,对于我们的自包含程序集来说,这很容易——只需放置一个属性;但有时我们的程序集引用未注释且假定为“SecurityCritical”的第三方DLL。这就是它变得“有趣”的地方 在过去几天的工作中,F#…NET security policy似乎出现了一个严重的问题。如果类型/方法引用或调用“SecurityCritical”,则NET security policy希望您使用[]注释它们代码,这恰好是NuGet上的大部分代

有人在部分信任场景中使用过F#代码吗?与中一样,使用
[)创建程序集。实际上,对于我们的自包含程序集来说,这很容易——只需放置一个属性;但有时我们的程序集引用未注释且假定为“SecurityCritical”的第三方DLL。这就是它变得“有趣”的地方

在过去几天的工作中,F#…NET security policy似乎出现了一个严重的问题。如果类型/方法引用或调用“SecurityCritical”,则NET security policy希望您使用
[]
注释它们代码,这恰好是NuGet上的大部分代码,因为这是它的默认值。现在,在F#中,在开始使用闭包之前,这一切正常。您不能执行以下操作:

namespace Foo

open System.Security

[<assembly: AllowPartiallyTrustedCallers>]
[<assembly: SecurityRules(SecurityRuleSet.Level2)>]
do()

[<SecurityCritical>]
module C =
    let get () = [ 1 .. 10 ]

[<SecuritySafeCritical>]
module M =

    let foo () =
        seq {
            for i in 1 .. 10 do
                yield!
                    C.get ()
                    |> Seq.filter (fun x -> x % 2 = 0)
        }
名称空间Foo
开放系统安全
[]
[]
do()
[]
模块C=
让get()=[1..10]
[]
模块M=
让富()=
序号{
因为我在1..10做
产量
C.get()
|>顺序过滤器(乐趣x->x%2=0)
}
此程序集无法通过
SecAnnotate.exe
检查,因为F#编译器将闭包提升为一个单独的类型,该类型现在未使用
[]
进行注释,默认为透明,但引用了一些关键代码,这是一个错误


这听起来像是一个小小的限制,但修改代码以避免闭包并满足SecAnnotate约束却花费了我很多小时。也许F#可以将安全属性传播到它创建的闭包类型?有没有另一种简单的方法可以解决这个问题?你可以将
SecurityCritical
作为程序集级属性应用:

[<assembly: SecurityCritical>]
[说:

指定程序集不能导致权限提升

透明程序集可以从部分受信任的代码访问,并且不能公开对任何受保护的资源或功能的访问。程序集中的代码不允许禁止代码访问安全检查,也不能导致权限提升

出于同样的原因,F#3.0版本的FSharp.Core也使用此属性

其他信息的链接:


感谢链接!不幸的是,在我的场景中,我试图启用部分受信任的代码来调用第三方
SecurityCriticalCode
(未注释的代码),因此似乎我确实需要APTCA+
[]
,至少在某个地方..您可以使用
[]
然后用
[]标记调用第三方程序集的任何方法/函数
。我认为这在除Silverlight之外的大多数部分信任情况下都有效。一旦你将程序集标记为SecurityTransparent,你就不能再使用SecuritySafeCritical了-它抱怨说,尝试使用SecAnnotate.exe。因此,程序集必须是APTCA。但无论如何,谢谢你,我想我走的是对的,我将不得不接受unnec因此,我的建议是突破BFG9000,编写一个
*.fsx
脚本,使用Mono.Cecil分析编译的程序集,然后使用
[]自动注释适当的方法
。这样,您就无需以某种特殊方式编写代码,也无需在每次构建代码时手动注释代码。
[<assembly: AllowPartiallyTrustedCallers>]
[<assembly: SecurityTransparent>]