2012-01-01 16 views
6

Bien, tengo una aplicación que quiero agregar soporte para que otras personas escriban los módulos que la aplicación cargará.C# Cargar ensamblaje de espacio aislado

Los módulos serían una clase que ampliaría mi clase de módulo, escrita en .Net. Necesito saber cómo cargar estos archivos DLL en un entorno de espacio aislado, solo permitiéndoles leer/escribir en ciertos directorios.

¿Esto es posible?

+1

preguntas similares: [carga de elementos de una aplicación .NET en una 'caja de arena para el Medio Ambiente'] (http://stackoverflow.com/questions/510071/loading-assemblies-from-a-net -application-in-a-sandbox-environment), [En .NET 4.0, ¿cómo 'sandbox' un ensamblaje en memoria y ejecuto un método?] (http://stackoverflow.com/questions/5997995/in- net-4-0-how-do-i-sandbox-an-in-memory-assembly-and-execute-a-method) –

+0

Su pregunta hace referencia a la etiqueta 'scripting'. ¿Planea compilar dinámicamente su código .NET o cómo se aplica esta etiqueta a su situación? –

Respuesta

9

Sí, esto es posible. Usando Code Access Security y .NET Sandbox. Te aconsejaría que eches un vistazo a la biblioteca CSScript (código abierto). Esta es una biblioteca que proporciona secuencias de comandos C# y compilación sobre la marcha en conjuntos dinámicos. Lo he usado en un proyecto para permitirles a los usuarios finales escribir scripts de C# y ejecutarlos, lo que permite la interacción con clases en mi sistema. El proyecto requería que no tuvieran acceso a File IO o MessageBox (UI) ya que las secuencias de comandos del usuario debían ejecutarse en un servidor. CSSCript usó elementos del framework .NET para limitar a qué tiene acceso el ensamblado y obtendrá una excepción si se llama a alguno de estos tipos prohibidos.

Así que échele un vistazo a eso. Voy a editar mi respuesta una vez que encuentre más detalles sobre cómo es posible, solo para que lo sepan es posible!


Ok lo encontró. Aquí es una discusión que tuve con el autor de CSScript hace unos años:

Me:

Estoy desarrollando una aplicación y desean exponer la capacidad de los usuarios a la escritura de ciertas acciones a través de la interfaz de usuario. CSScript se ve muy bien para esto. Sin embargo, también deseo permitir a los usuarios hacer esto y ejecutar sus scripts en un servidor web. Ahora bien, esta es una pesadilla de seguridad ya que los usuarios podrían escribir "Directory.Delete (@" C: \ ", true)" y borrar el disco duro. Entonces, ¿sería posible restringir los ensamblados, los espacios de nombres o incluso las clases a las que un usuario puede acceder desde su secuencia de comandos, para ejecutar el CSScript en un entorno seguro?

Oleg:

La solución atractiva inmediata es utilizar .NET recinto de seguridad. Está diseñado exactamente para este tipo de escenarios. El entorno limitado estándar CLR está disponible para la aplicación de host que ejecuta scripts con CS-Script. La idea es inicializar CAS antes de cargar el script sospechoso y el resto es responsabilidad de CLR. Y si necesita configurar permisos de directorios/archivos, hágalo con herramientas CAS. De esta manera, las secuencias de comandos son un "transporte" para la rutina proporcionada por su usuario. Y CS-Script es un mecanismo conveniente para implementar dicho transporte, pero las preocupaciones de seguridad reales son abordadas por .NET Sendoxing, que tiene un conjunto completo de funcionalidades para cubrir prácticamente todos los escenarios de seguridad posibles. Con CS-script descargables puede buscar la muestra de Sendboxing (\ Samples \ Sandboxing) que muestra cómo evitar el script desde las operaciones de E/S de archivo (por ejemplo, crear archivo).

Por lo tanto, a partir de esto, creo que es necesario mirar .NET Sandbox y cargar los conjuntos en eso. Me doy cuenta de que este ejemplo es específico de C# Scripting pero creo que es aplicable a su escenario ya que los ejemplos de CSScript anteriores le mostrarán una forma de lograr el espacio aislado y la seguridad.

Algunos ejemplos específicos de cómo cargar los ensamblajes en una caja de arena se pueden encontrar aquí:

ya que estamos discutiendo carga de módulos, tiene ¿Has oído hablar de Microsoft Prism? Esto proporciona un buen marco para la carga del módulo y la inyección de dependencia (a través de Unity o MEF) que podría ser muy útil al desarrollar una arquitectura de complemento.

Saludos,

+0

Gracias por la información, los veré mañana (¡a las 3 de la mañana!). He estado tratando de obtener la respuesta de [Aquí] (http://stackoverflow.com/questions/5997995/in-net-4- 0-how-do-i-sandbox-an-in-memory-assembly-and-execute-a-method) pero cuando intento cargar mi módulo dice que no puede encontrarlo o uno si se trata de dependencias. Espero que mañana pueda resolver algo con todos los enlaces que ustedes me enviaron. – BoJaN

Cuestiones relacionadas