2010-09-27 27 views
4

Dans une application shell, je dois pouvoir charger et exécuter d'autres assemblys .NET à l'exécution, mais sans leur accorder une confiance totale. Essentiellement, je veux les limiter (les assemblys chargés) de toucher n'importe quelles ressources du système (threading, mise en réseau, etc), avec la seule exception étant le stockage isolé. Cependant, les assemblages qui proviennent de "moi" doivent être exécutés en toute confiance..NET/Sécurité: Limitation des assemblys chargés à l'exécution pour accéder à certaines API

Je pensais à Code Access Security, mais je ne suis pas sûr que ce soit ce que je devrais utiliser.

Comment vous y êtes-vous pris?

Répondre

8

CAS est à peu près ce dont vous avez besoin ici. Plus précisément, vous voulez charger l'ensemble dans son propre domaine d'application:

var myEvidence = new Evidence(new object[] {SecurityZone.Internet}); 
var newDomain = AppDomain.CreateDomain("InternetDomain"); 
myDomain.Load("MyUntrustedAssembly.dll", myEvidence); 
myDomain.CreateInstanceAndUnwrap("MyUntrustedAssembly","MyUntrustedObjectType"); 

//do your work with the untrusted assembly/type 

AppDomain.Unload(myDomain); 

Lisez sur le sujet Domaines d'application, les différentes zones, et les ensembles d'autorisations par défaut qui leur sont assignées. Internet est le plus restrictif des zones/ensembles d'autorisations définis par le système dans lesquels les assemblages peuvent encore être réellement exécutés (il y a aussi la zone Restreinte, les assemblages tombant dans cette zone ne peuvent pas être exécutés). Vous pouvez utiliser l'outil de configuration .NET pour créer des ensembles d'autorisations et définir les conditions (preuve) auxquelles le code doit satisfaire pour obtenir le jeu d'autorisations.

+1

+1 pour la suggestion AppDomain –

+0

Merci pour la suggestion! Une chose: les assemblages doivent exécuter une interface utilisateur WPF. J'ai oublié de mentionner cela plus tôt. Je doute cependant que cela soit possible dans une zone aussi restreinte. –

+0

La zone Internet a toujours accès au thread UI; les assemblées qui y sont exécutées peuvent créer et afficher des fenêtres. Cependant, je ne sais pas si vous avez accès à des graphismes accélérés, et vous ne pouvez certainement pas utiliser GDI + pour travailler avec des fenêtres non gérées. – KeithS