Может ли домен приложения быть ограничен одним каталогом? - PullRequest
6 голосов
/ 20 мая 2010

Я разрабатываю плагин хоста. Плагины должны иметь как можно меньше доверия, однако я хочу, чтобы у плагина была возможность чтения и записи файлов.

Может ли домен домена, в который будет загружена сборка, быть ограничен, чтобы иметь доступ только к одному каталогу для чтения и записи?

Также приветствуются другие варианты и способы решения этой проблемы, такие как, например, простые способы потоковой передачи данных файлов с хоста на плагин (чтение) и с плагина на хост (запись).

Если это актуально: я использую инфраструктуру MAF для плагинов. http://msdn.microsoft.com/en-us/library/bb384200.aspx

1 Ответ

6 голосов
/ 20 мая 2010
namespace ConsoleApplication
{
    #region Imports

    using System;
    using System.IO;
    using System.Security;
    using System.Security.Permissions;

    #endregion

    public class Plugin : MarshalByRefObject
    {        
        public string TestRead(string path)
        {
            try
            {
                File.ReadAllBytes(path);
                return "Done";
            }
            catch (SecurityException)
            {
                return "Access Denied";
            }
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            var setup = new AppDomainSetup();

            setup.ApplicationBase = 
                AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

            var perm = new PermissionSet(PermissionState.None);

            perm.AddPermission(
                new SecurityPermission(
                    SecurityPermissionFlag.Execution));

            perm.AddPermission(
                new FileIOPermission(
                    FileIOPermissionAccess.Read, "c:\\public\\"));

            var pluginDomain = 
                AppDomain.CreateDomain("PluginDomain", null, setup, perm);

            var plugin = 
                pluginDomain.CreateInstanceAndUnwrap(
                    typeof(Plugin).Assembly.FullName,
                    typeof(Plugin).FullName) as Plugin;

            Console.WriteLine(plugin.TestRead("c:\\public\\test.txt"));
            Console.WriteLine(plugin.TestRead("c:\\secret\\test.txt"));
            Console.ReadKey();
        }
    }
}
...