Внутри приложения ASP.NET я хочу создать домен приложения, в котором будет выполняться недоверенный код. Однако при инициализации и развертывании моего загрузчика сборки создается исключение для типа, который я не передаю. Это текущий пользователь из веб-запроса (HttpContext.Current.User
), который, я думаю, доступен через LocalCallContext. Я не хочу, чтобы текущий пользователь был доступен для ненадежного кода, на самом деле я хочу, чтобы ненадежный код вообще не получал контекста. Поэтому я думаю, что смогу передать явный CallContext, но, похоже, такого не происходит. Как бы я этого достиг?
Ненадежный код - это предоставленные пользователем шаблоны Razor, которые будут выполняться через RazorEngine.
Evidence evidence = new Evidence();
evidence.AddHostEvidence(new Zone(SecurityZone.Internet));
PermissionSet permissionSet = SecurityManager.GetStandardSandbox(evidence);
FileIOPermission permission = new FileIOPermission(PermissionState.None);
FileIOPermissionAccess access = FileIOPermissionAccess.Read | FileIOPermissionAccess.PathDiscovery;
permission.AddPathList(access, typeof(AssemblyLoader).Assembly.Location);
permissionSet.AddPermission(permission);
// We have to load ourself with full trust
StrongName loaderAssembly = typeof(AssemblyLoader).Assembly.Evidence.GetHostEvidence<StrongName>();
StrongName razorEngineAssembly = typeof(RazorEngineService).Assembly.Evidence.GetHostEvidence<StrongName>();
StrongName razorAssembly = typeof(RazorTemplateEngine).Assembly.Evidence.GetHostEvidence<StrongName>();
AppDomainSetup appDomainSetup = new AppDomainSetup
{
ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase
};
AppDomain sandBoxDomain = AppDomain.CreateDomain("Razor Template Sandbox", null, appDomainSetup, permissionSet, loaderAssembly, razorEngineAssembly, razorAssembly);
AssemblyLoader loader = (AssemblyLoader)sandBoxDomain.CreateInstanceFromAndUnwrap(typeof(AssemblyLoader).Assembly.Location, typeof(AssemblyLoader).FullName);
Последняя строка выдает это исключение, UnrelatedAssembly.SomeType
является типом моего HttpContext.Current.User
:
System.Runtime.Serialization.SerializationException: 'Type is not resolved for member 'UnrelatedAssembly.SomeType,UnrelatedAssembly, Version=1.9.0.0, Culture=neutral, PublicKeyToken=null'.'