Изоляция / песочница ненадежного кода в домене приложения .NET - PullRequest
1 голос
/ 27 марта 2012

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

При создании домена приложения я передаю StrongName для TrustedAssembly в качестве 5-го аргумента (параметры StrongName [] fulltrustAssemblies).

Однако, когда вызовы UntrustedAssembly в TrustedAssembly, я все еще получаю исключение безопасности при доступе в Интернет.

TrustedAssembly допускает частичное доверие доверенных абонентов.

Ниже приведен код, который я использую для создания песочницы и обеих сборок. не уверен, что мне здесь не хватает. Я не эксперт по безопасности, и я знаю, что многое изменилось в .NET 4.0.

спасибо заранее!

Olaf

Создание домена приложения

//set up permisssion set for 'internet' zone.
Evidence ev = new Evidence();
ev.AddHostEvidence(new Zone(SecurityZone.Internet));
PermissionSet internetPS = SecurityManager.GetStandardSandbox(ev);

//get SN for 'TrustedAssembly'.
var trustedAssemblySN = typeof(IAgent).Assembly.Evidence.GetHostEvidence<StrongName>();

//create appdomain
AppDomainSetup setup = new AppDomainSetup { ApplicationBase = @"C:\path\to\UntrustedAssembly\bin\Debug\" };
var appdomain = AppDomain.CreateDomain("sandbox", null, setup, internetPS, trustedAssemblySN);

var agent = (IAgent)appdomain.CreateInstanceAndUnwrap("UntrustedAssembly", "UntrustedAssembly.Agent");
var context = (IContext)appdomain.CreateInstanceAndUnwrap("TrustedAssembly", "TrustedAssembly.Context");
agent.Run(context);

Доверенная сборка

[assembly: AllowPartiallyTrustedCallers]

namespace TrustedAssembly
{
    public interface IAgent
    {
        void Run(IContext context);
    }

    public interface IContext
    {
        Stream DownloadStream(Uri resource);
    }

    public class Context : MarshalByRefObject, IContext
    {
        public Stream DownloadStream(Uri resource)
        {
            WebRequest req = WebRequest.Create(resource);
            //i would have expected this to succeed.

            WebResponse resp = req.GetResponse();
            return resp.GetResponseStream();
        }
    }
}

Ненадежная сборка

namespace UntrustedAssembly
{
    public class Agent : MarshalByRefObject, TrustedAssembly.IAgent
    {
        public void Run(TrustedAssembly.IContext context)
        {
            var stream = context.DownloadStream(new Uri("http://google.com"));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...