C # vertraut voll Montage mit SecuritySafeCritical Funktion wirft nach wie vor Sicherheit Ausnahmen

StackOverflow https://stackoverflow.com/questions/3704981

  •  02-10-2019
  •  | 
  •  

Frage

Ich versuche, für das Laden Erweiterungen / Plugins eine Sandbox AppDomain zu erstellen. Ich habe einen MarshalByRefObject, dass im Inneren des Appdomain in instantiate die DLL zu laden. Ich erhalte SecurityExceptions wenn die DLL zu laden versuchen, und ich kann nicht herausfinden, wie um sie zu erhalten, während immer noch zu begrenzen, was die dritte Code Partei tun kann. Alle meine Projekte sind .net 4.

Die InDomainLoader Klasse ist in einer vollständig vertrauenswürdigen Domäne ist das Verfahren SecuritySafeCritical markiert. Von allem, was ich gelesen habe, ich denke, das sollte funktionieren.

Hier ist meine Loader-Klasse, die die AppDomain und springt hinein erzeugt:

public class Loader
{
    public void Load(string dll, string typeName)
    {
        Log.PrintSecurity();

        // Create new AppDomain
        var setup = AppDomain.CurrentDomain.SetupInformation;
        var permissions = new PermissionSet(null);
        permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
        var strongname = typeof(InDomainLoader).Assembly.Evidence.GetHostEvidence<StrongName>();
        var strongname2 = typeof(IPlugin).Assembly.Evidence.GetHostEvidence<StrongName>();
        AppDomain domain = AppDomain.CreateDomain("plugin", null, setup, permissions, strongname, strongname2);

        // Create instance
        var loader = (InDomainLoader)domain.CreateInstanceAndUnwrap(
            typeof (InDomainLoader).Assembly.FullName, typeof (InDomainLoader).FullName);

        // Jump into domain
        loader.Load(dll, typeName);
    }
}

Und hier sind die Bootstrap-Loader, dass läuft in der Domäne:

public class InDomainLoader : MarshalByRefObject
{
    [SecuritySafeCritical]
    public void Load(string dll, string typeName)
    {
        Log.PrintSecurity();

        var assembly = Assembly.LoadFrom(dll);  // <!-- SecurityException!
        var pluginType = assembly.GetType(typeName);

        var demoRepository = new DemoRepository();
        var plugin = (IPlugin)Activator.CreateInstance(pluginType, demoRepository);
        Console.WriteLine(plugin.Run());
    }
}

Einige Logging-Anweisungen sagen mir, dass die Versammlung der IsFullyTrusted wahr ist und das Verfahren hat sowohl IsSecurityCritical und IsSecuritySafeCritical Satz auf true, IsSecurityTransparent falsch ist.

ich gezippt das gesamte Projekt bis zu http://davidhogue.com/files/PluginLoader.zip < bei / a>, das diese leichter macht.

Wenn jemand eine Idee hat, wäre ich sehr dankbar. Ich scheine hier in einer Sackgasse stecken.

War es hilfreich?

Lösung

Well a beginnen sollten Sie wahrscheinlich nicht die Funktion als SecuritySafeCritical Markierung als dass nicht vertrauenswürdigen Anrufer bedeutet, dass Sie anrufen kann, was Sie wollen wahrscheinlich nicht wirklich (nicht, dass es sollte ein wichtiges Thema sein).

Wie für Ihr Problem des Problem ist, dass standardmäßig Sie noch nicht mit besonderen Berechtigungen ausgeführt, die normale einfache Möglichkeit, den Montag Laden zu tun ist, können Sie Ihre eigene AppDomainSetup erstellen und die Application an einem Plugin-Verzeichnis von einer Art zeigen (was keine schlechte Idee, in der Regel ist), können Sie dann mit dem normalen Assembly.Load ( „Assembly“) der Basis laden aus. Allerdings, wenn Sie eine beliebige Datei laden muss, dann müssen Sie assert FileIOPermission für das Plugin dll (vollständiger Pfad), d.

private Assembly LoadAssemblyFromFile(string file)
{
    FileIOPermission perm = new FileIOPermission(FileIOPermissionAccess.AllAccess, file);
    perm.Assert();

    return Assembly.LoadFile(file);
}
scroll top