2013-07-12 27 views
12

有人在部分信任場景中使用F#代碼的經驗嗎?如在創建程序集[<AllowPartiallyTrustedCallers>]如何有效地創建部分信任的F#程序集?

我正在處理幾個需要能夠以部分信任方式運行的項目,並且我們一直在嘗試使用2級安全規則(http://msdn.microsoft.com/en-us/library/dd233102.aspx)。在實踐中,我們的獨立裝配很容易 - 只需放置一個屬性;但有時我們的程序集會引用未註釋並假定爲「SecurityCritical」的第三方DLL。這是它變得「有趣」的地方。

過去幾天一直使用它,似乎有一個與F#嚴重的問題。如果.NET安全策略引用或調用「SecurityCritical」代碼,那麼您需要使用[<SecuritySafeCritical>]註釋類型/方法,這恰好是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) 
     } 

該組件未通過SecAnnotate.exe檢查,因爲F#編譯器擡起封閉到一個單獨的類型,這是現在不[<SecuritySafeCritical>]註釋,默認爲透明的,但引用了一些關鍵代碼,這是一個錯誤。

這聽起來像是一個小小的限制,但它花費我許多小時來更改代碼以避免關閉並滿足SecAnnotate約束。也許F#可以傳播安全屬性到它創建的封閉類型?有沒有其他簡單的方法可以解決這個問題?

回答

6

你可以申請SecurityCritical作爲一個集級屬性:

[<assembly: SecurityCritical>] 

但更好的方法,假設你只是寫一個「普通」 F#程序集 - 即一個沒有做任何事情這需要特殊的安全性(例如,P/Invoke的) - 將更換:

[<assembly: AllowPartiallyTrustedCallers>] 

[<assembly: SecurityTransparent>] 

SecurityTransparentAttribute的MSDN頁面說:

指定程序集不能引起特權提升。

可以從部分受信任的代碼訪問透明程序集,並且不能公開對任何受保護資源或功能的訪問。不允許程序集中的代碼禁止代碼訪問安全性檢查,並且不會導致特權提升。

FSharp.Core的F#3.0版本也出於同樣的原因使用此屬性。

鏈接到其他信息:

+0

感謝您的聯繫!不幸的是,在我的情況下,我試圖啓用部分可信的代碼來調用第三方SecurityCriticalCode(未註釋的代碼),所以看起來像我*做*需要APTCA + [[SecuritySafeCritical]],至少在某處.. – t0yv0

+0

您可能可以使用'[]',然後用'[]標記任何調用第三方程序集的方法/函數。我認爲這可以在大多數部分信任的情況下工作,除了Silverlight。 –

+0

將程序集標記爲SecurityTransparent後,就不能再使用SecuritySafeCritical了 - 嘗試使用SecAnnotate.exe,它會抱怨。因此,組裝必須是APTCA。但無論如何,我想我正處在正確的軌道上,只能忍受F#爲此做出的不必要的複雜事情。 – t0yv0

相關問題