有人在部分信任場景中使用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#可以傳播安全屬性到它創建的封閉類型?有沒有其他簡單的方法可以解決這個問題?
感謝您的聯繫!不幸的是,在我的情況下,我試圖啓用部分可信的代碼來調用第三方SecurityCriticalCode(未註釋的代碼),所以看起來像我*做*需要APTCA + [[SecuritySafeCritical]],至少在某處.. – t0yv0
您可能可以使用'[]',然後用'[]標記任何調用第三方程序集的方法/函數。我認爲這可以在大多數部分信任的情況下工作,除了Silverlight。 –
將程序集標記爲SecurityTransparent後,就不能再使用SecuritySafeCritical了 - 嘗試使用SecAnnotate.exe,它會抱怨。因此,組裝必須是APTCA。但無論如何,我想我正處在正確的軌道上,只能忍受F#爲此做出的不必要的複雜事情。 – t0yv0