Hat jemand Erfahrung mit F # -Code in Teilvertrauenszenarien? Wie in, Erstellen von Baugruppen mit [<AllowPartiallyTrustedCallers>]
?Wie effektiv F # Assemblys für partielles Vertrauen zu erstellen?
Ich arbeite an ein paar Projekten, die wir in teilweise Vertrauen ausführen müssen, und wir haben versucht, Level 2 Security Rules (http://msdn.microsoft.com/en-us/library/dd233102.aspx) zu verwenden. In der Praxis für unsere in sich geschlossenen Versammlungen ist das einfach - setzen Sie einfach ein Attribut; aber manchmal verweisen unsere Assemblies auf Drittanbieter-DLLs, die nicht kommentiert sind und "SecurityCritical" angenommen haben. Hier wird es "interessant".
Nachdem ich in den letzten paar Tagen damit gearbeitet habe, scheint es ein ernstes Problem mit F # zu geben. Die .NET-Sicherheitsrichtlinie erwartet, dass Sie Typen/Methoden mit annotieren, wenn sie "SecurityCritical" -Code referenzieren oder aufrufen, was der größte Teil des Codes in NuGet ist, da dies der Standardwert ist. In F # funktioniert das jetzt so lange, bis Sie mit den Schließungen beginnen. Sie können nicht tun:
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)
}
Diese Baugruppe versagt SecAnnotate.exe
Kontrollen passieren, weil F # -Compiler des Verschlusses an einem separaten Typ hebt, die nun mit [<SecuritySafeCritical>]
kommentierten nicht ist, standardmäßig transparent, aber Referenzen einige kritische Code, der eine ist Error.
Es klingt wie eine kleine Einschränkung, aber es kostet mich viele Stunden Code zu ändern, um Schließungen zu vermeiden und SecAnnotate Einschränkungen zu erfüllen. Vielleicht könnte F # Sicherheitsattribute an von ihm erstellte Schließungstypen propagieren? Gibt es einen anderen einfachen Weg, den ich vermisse?
Danke für die Links!Leider versuche ich in meinem Szenario, teilweise vertrauenswürdigen Code zu aktivieren, um Drittanbieter-'SecurityCriticalCode' (unnotierter Code) aufzurufen, so dass ich * APTCA +' [] 'zumindest irgendwo brauche. –
t0yv0
Möglicherweise können Sie '[]' verwenden und dann alle Methoden/Funktionen markieren, die mit '[]' in die Assembly eines Drittherstellers geladen werden. Ich denke, das wird in den meisten Situationen mit teilweisem Vertrauen funktionieren, außer bei Silverlight. –
Sobald Sie eine Assembly als SecurityTransparent markieren, können Sie SecuritySafeCritical nicht mehr verwenden - versuchen Sie es mit SecAnnotate.exe, beschwert es sich. Daher muss die Assembly APTCA sein. Aber danke trotzdem, ich denke, ich bin auf dem richtigen Weg, werde einfach mit den unnötigen Komplikationen leben müssen, die F # dafür macht. – t0yv0