在.NET appdomain中隔离/沙箱化不受信任的代码

在.NET appdomain中隔离/沙箱化不受信任的代码,.net,security,appdomain,sandbox,.net,Security,Appdomain,Sandbox,我正在尝试隔离权限集较低的Appdomain中的代码。 但是,我想公开一些通过接口(在我信任的程序集中实现)提供的特定功能 创建appdomain时,我将TrustedAssembly的StrongName作为第5个参数传递(参数StrongName[]FullTrustAssembly) 然而,当不可信组件调用TrustedAssembly时,我在访问internet时仍然会遇到安全异常 TrustedAssembly允许部分受信任的调用者 下面是我用来创建沙箱和两个程序集的代码。 不知道我错

我正在尝试隔离权限集较低的Appdomain中的代码。 但是,我想公开一些通过接口(在我信任的程序集中实现)提供的特定功能

创建appdomain时,我将TrustedAssembly的StrongName作为第5个参数传递(参数StrongName[]FullTrustAssembly)

然而,当不可信组件调用TrustedAssembly时,我在访问internet时仍然会遇到安全异常

TrustedAssembly允许部分受信任的调用者

下面是我用来创建沙箱和两个程序集的代码。 不知道我错过了什么。我不是安全专家,我知道在.NET4.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"));
        }
    }
}

我想我明白了。必须添加以下步骤:1。使用[SecuritySafeCritical]属性2修饰任何需要额外信任的方法。在这些方法的范围内断言(和还原)特定的方法。