Я пытаюсь изолировать код в домене приложений с низким набором разрешений.
Тем не менее, я хотел бы показать некоторые конкретные функциональные возможности, предоставляемые через интерфейс (который реализован в сборке, которой я доверяю).
При создании домена приложения я передаю 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"));
}
}
}