部分受信任的 AppDomain 中的代码在相对路径解析中引发 System.Security.Permissions.FileIOPermission

Posted

技术标签:

【中文标题】部分受信任的 AppDomain 中的代码在相对路径解析中引发 System.Security.Permissions.FileIOPermission【英文标题】:Code in Partially-Trusted AppDomain throws System.Security.Permissions.FileIOPermission on Relative Path resolve 【发布时间】:2016-04-18 17:34:28 【问题描述】:

我正在向我创建的框架添加沙盒层。

主要概念是框架加载类似插件的 DLL。

在插件加载时,我创建了一个 AppDomain 来隔离执行并将 AppDomain 的 ApplicationBase 设置为 DLL 的目录并将访问权限设置为完全。

现在的问题是,在插件内部,虽然基本路径设置正确,但如果代码尝试使用其相对路径加载文件,.net 将引发 System.Security.Permissions.FileIOPermission 异常。

但是,使用绝对路径可以轻松加载相同的文件。

我尝试了不同的安全权限集,但没有人修复相对路径加载问题。

这是我正在使用的代码:

//AppDomain creation

string directory = Path.GetDirectoryName(assemblyPath);

PermissionSet permissionSet = new PermissionSet(PermissionState.None);

permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));

permissionSet.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess, directory));

permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Infrastructure));

AppDomainSetup appDomainSetup = new AppDomainSetup

   ApplicationBase = directory,

   PrivateBinPath = directory,

   PrivateBinPathProbe = directory
;

AppDomain appDomain = AppDomain.CreateDomain("Sandbox", null, appDomainSetup, permissionSet);


//Code running inside the AppDomain

string path = File.ReadAllBytes(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,Path.Combine("Resources","Image.jpg"))); //Works fine

string path = Path.GetFullPath(Path.Combine("Resources","Image.jpg")); //Throws System.Security.Permissions.FileIOPermission exception

我知道我可以选择第一种方法,但我希望框架尽可能灵活,因此我更愿意为这个问题找到解决方法。

任何人都可以提供任何解决方案或建议吗?

【问题讨论】:

【参考方案1】:

没关系,

我自己找到了问题的答案。

我必须将 AppDomain 的 Environment.CurrentDirectory 设置为正确的值。

【讨论】:

以上是关于部分受信任的 AppDomain 中的代码在相对路径解析中引发 System.Security.Permissions.FileIOPermission的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能订阅部分信任 AppDomain 中的事件?

沙盒 AppDomain 跨程序集异常处理

在沙盒 Appdomain 中加载程序集 - SecurityException

.net 4 部分信任来自 GAC 的程序集

防止不受信任的 C# 代码启动新线程或黑名单/白名单 API

在中等信任的 ASP.Net 中读取程序集 Guid 而不锁定 appdomain 中的 DLL