2017-09-24 8 views
0

Je lance un assemblage de macros dans mon application principale. La macro n'a pas besoin d'accéder à l'assembly parent. Ceci est l'extrait:Charger l'assemblage dans un nouveau domaine d'application, l'ensemble parent doit être entièrement approuvé

Assembly ParentAssembly 
{ 
    class c1 
    { 
     void RunMacro() 
     { 
      System.Security.PermissionSet PS = new System.Security.PermissionSet(PermissionState.None); 
      PS.AddPermission(new SOME_PERMISSIONS....); 
      AppDomainSetup ADS = new AppDomainSetup(); 
      ADS.ApplicationBase = "c:"; 
      AppDomain domain = AppDomain.CreateDomain(SomeName, null, ADS, PS); 

      System.Runtime.Remoting.ObjectHandle handle = Activator.CreateInstanceFrom(domain, typeof(Sandboxer2).Assembly.ManifestModule.FullyQualifiedName, typeof(Sandboxer2).FullName); 
      Sandboxer2 m = (Sandboxer2)handle.Unwrap(); 
      m.Execute(); 
     } 
    } 
} 

Je reçois cette exception:

tentative par la méthode transparente de sécurité 'SandBoxer.Sandboxer2.Execute()' pour accéder à la sécurité méthode critique « System.AppDomain.add_AssemblyResolve (System.ResolveEventHandler) ' a échoué. L'assembly 'Nom complet de l'assembly parent ...' est partiellement approuvé, ce qui fait en sorte que le CLR le rend totalement transparent en matière de sécurité indépendamment des annotations de transparence de l'ensemble lui-même. Afin de code de sécurité d'accès critique, cet assembly doit être entièrement approuvé.

Ma question:

  1. Est-il possible d'éviter l'assemblage mère de chargement dans l'assemblage des enfants?

  2. En deuxième ligne de mon code, quelles autorisations peuvent résoudre le problème?

  3. Certains assemblys seront chargés par l'événement AssemblyResolve de SandBoxer lors de l'exécution. Les assemblys sont chargés à partir de la base de données sous forme de tableau binaire ou de GAC. Ils ne sont pas entièrement fiables. Je contrôle leur comportement avec des objets d'autorisation ajoutés à la deuxième ligne de code. Y a-t-il des permissions spéciales que je dois ajouter pour ne les laisser que chargées en tant qu'assemblages partiellement approuvés?

Je pense que tout peut être fait en ajoutant des autorisations de sécurité comme deuxième ligne de code, Si je suis mal compris le concept, je vous serais reconnaissant d'être guidé. L'assemblage principal est l'assemblage de l'application principale qui crée l'instance de SandBoxr et l'exécute. S'il vous plaît jeter un oeil à la classe SandBoxer2 et sa méthode Execute:

public class Sandboxer2 : MarshalByRefObject 
{ 
    public void Execute() 
    { 
     AppDomain ad = AppDomain.CurrentDomain; 
     ad.AssemblyResolve += MyHandler; 
     . 
     . 
     . 
    } 
} 

A l'intérieur de méthode Execute, après annonce est instancié, je ad.GetAssemblies() et cela a été la liste de tous les ensembles déjà chargés. La ligne numéro 2 conserve ParentAssembly dès le début de l'exécution de sandboxer.

  • [0] {mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089} {System.Reflection.Assembly System.Reflection.RuntimeAssembly}
  • [1] {système. Web, version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a} {System.Reflection.Assembly System.Reflection.RuntimeAssembly}
  • [2] {ParentAssembly, version = 1.0.0.0, Culture = neutral, PublicKeyToken = null} System.Reflection.Assembly {System.Reflection.RuntimeAssembly}
  • [3] {System.Data, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089} System.Reflection.Assemblée {} System.Reflection.RuntimeAssembly
  • [4] {Système, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089} {System.Reflection.Assembly System.Reflection.RuntimeAssembly}
  • [5 ] {MacroBase_IO, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null} System.Reflection.Assembly {System.Reflection.RuntimeAssembly}
  • [6] {System.Core, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089} System.Reflection.Assembly {System.Reflection.RuntimeAssembly}
  • [7] {System.Configuration, Version = 4.0.0.0, Culture = neutre, Pu blicKeyToken = b03f5f7f11d50a3a} {System.Reflection.Assembly System.Reflection.RuntimeAssembly}
  • [8] {System.Xml, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089} {System.Reflection.Assembly système .Reflection.RuntimeAssembly}
+0

Quel assemblage vous appelez "parent"? (Clairement pas celui qui contient 'SandBoxer2', mais il n'y a pas d'autres assemblages mentionnés). Il peut être préférable d'utiliser des noms spécifiques (même s'ils ne correspondent pas exactement à ce que vous utilisez dans votre code réel). –

+0

J'ai modifié ma question. ParentAssembly est celui qui contient mon premier extrait. –

Répondre

0

réponse aux questions 1 et 2:

Sandboxer doit être dans un ensemble séparé (une autre DLL) et cet ensemble séparé doit être signé avec une clé. Ensuite, l'application principale ne sera pas chargée automatiquement et cette exception ne sera pas levée.

Edit:

1- signature avec une clé se fait à travers des propriétés de l'onglet Assemblée-Signature.

2- Cette sample permet de comprendre comment définir un assembly comme une confiance totale et d'introduire des noms forts dans Sandbox.