部分受信任的 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 中加载程序集 - SecurityException