Microsoft Addin Framework(MAF)回调的安全例外,使用两个AppDomains



我的应用程序有许可问题:

我有一个在完全受信任的应用程序域中运行的主机应用程序。该主机通过MAF框架加载ADDIN,并在另一个只有Internet访问的应用程序中激活此加载项。

主机在主应用程序域中创建一个辅助对象,并通过MAF-Pipeline将其引用传递给加载项(使用HostView和附加视图适配器)。然后,加载程序在此辅助对象上调用一种方法,该方法应从文件系统加载文本文件。执行此操作时,我正在确保安全性:

An unhandled exception of type 'System.Security.SecurityException' occurred    in mscorlib.dll
Additional information: Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.

我已经对代码进行了一些调试,发现在类FileStream.cs中,有以下检查:

new FileIOPermission(secAccess, control, new String[] { filePath }, false, false).Demand();

需求方法是在CodeAccesspermissions.cs中实现的,如果所有元素都具有执行此方法的权限,则似乎检查了完整的调用堆栈:

StackCrawlMark stackMark = StackCrawlMark.LookForMyCallersCaller;

当我直接从主要方法中执行此方法时,一切都很好。

当我将加载项的权限设置为FullTrust时,它也可以正常工作。

我还检查了AppDomain和AppDomain.CurrentDomain.istormated属性,在所有情况下都是正确的。

因此,这似乎是addin在呼叫堆中的问题,这会导致权限问题。

我还试图在新线程中执行此操作,以便不再在呼叫堆栈中添加addin,但没有效果。

这个问题对我来说非常重要,因为我不想授予加载项的全疗法,但请让主机上的加载项执行方法。

有人知道解决这个问题的解决方案吗?

我在解决方案中发现:

可以通过在权限对象上使用assert方法来停止所谓的堆栈步行:

PermissionSet permSet = new PermissionSet(PermissionState.Unrestricted);
permSet.Assert();
//Do the problematic Stuff
PermissionSet.RevertAssert();

使用ReverTassert,堆栈漫步将不再停止。

善意

tobi

相关内容

  • 没有找到相关文章

最新更新