我正在尝试使用低权限集隔离Appdomain中的代码。 但是,我想公开一些通过接口提供的特定功能(在我信任的程序集中实现)。
创建appdomain时,我将TrustedAssembly的StrongName作为第5个参数传递(params StrongName [] fulltrustAssemblies)。
但是,当UntrustedAssembly调用TrustedAssembly时,我仍然在访问互联网时遇到安全异常。
TrustedAssembly允许使用PartiallyTrustedCallers。
下面是我用来创建沙箱和两个程序集的代码。 不知道我在这里失踪了什么。我不是安全专家,我知道.NET 4.0中有很多变化。
提前感谢!
奥拉夫
创建AppDomain
//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"));
}
}
}