使用两个AppDomain的Microsoft AddIn Framework(MAF)回调的安全例外

时间:2015-05-04 13:43:29

标签: c# security add-in maf

我的申请存在权限问题:

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

主机在主App-Domain中创建一个Helper-Object,并通过MAF-Pipeline将其引用传递给外接程序(使用HostView和外接程序视图适配器)。然后,外接程序调用此Helper-Object上的一个方法,该方法应从文件系统加载一个Textfile。执行此操作时,我正在进行一次SecurityException:

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();

Demand-Method在CodeAccessPermissions.cs中实现,并且如果所有元素都具有执行此方法的权限,则似乎检查完整的调用堆栈:

StackCrawlMark stackMark = StackCrawlMark.LookForMyCallersCaller;

当我直接在Main方法中对Helper类执行此方法时,一切正常。

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

我还检查了AppDomain和AppDomain.CurrentDomain.IsFullyTrusted属性,在所有情况下都是如此。

因此,似乎是AddIn在Call-Stack中的问题,这会导致权限问题。

我也尝试在新的Thread中执行此操作,以便不再在调用堆栈中使用AddIn,但这没有效果。

这个问题对我来说非常重要,因为我不想授予外接程序完全权限,但让外接程序在主机上执行方法。

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

1 个答案:

答案 0 :(得分:0)

我在同时找到了一个解决方案:

可以通过在权限对象上使用Assert方法来停止所谓的Stack Walk:

PermissionSet permSet = new PermissionSet(PermissionState.Unrestricted);

permSet.Assert();

//Do the problematic Stuff

PermissionSet.RevertAssert();

使用RevertAssert,StackWalk将不再停止。

亲切的问候

托比