受限的应用程序访问升级服务中的添加程序应如何
题
我目前使用MAF创建一个加载项模型,其中加载程序被加载到受限的AppDomain(Internet许可)中。这意味着加载项无法调用我们的数据库,这在大多数情况下是我们想要的,因为我们希望防止直接针对DB运行任何查询的加载项作者。
我们希望他们使用某种形式的主机API,以使他们能够执行某些任务(例如运行非常具体的查询或发送电子邮件)。谁能告诉我最好的方法?
我尝试设置AppDomain以处理包含主机API作为完整信任程序集的组件,同时以有限的方式运行加载项,但是当我尝试打开DB连接时,我仍然会获得SecurityExceptions。
解决方案
好的,我设法解决了这个问题。对于需要知道的人:
- 在其中使用主机API创建一个组件,并允许加载项引用它。
- 确保包含主机API的组件具有在组件级别上的[允许partallyTrustedCallers]属性,并将其强名称为组件。
- 确保主机API程序集已在AppDomain注册为完整的信托组件(请参阅 http://blogs.msdn.com/b/shawnfa/archive/2005/08/08/449050.aspx 关于如何做到这一点)。
- 确保主机API上需要升级权限的方法装饰 SecuritySafecritical 属性(.NET 4)。
在每种方法开始时需要完全信任,您需要升级的权限,然后直接删除需求。下面的代码提供了一种将授权的方法,该方法将完全信任地运行。
/// <summary> /// Runs the supplied delegate using full trust /// </summary> /// <typeparam name="T"></typeparam> /// <param name="func"></param> /// <returns></returns> private static T RunWithFullTrust<T>(Func<T> func) { //NOTE: This line grants the method full trust new PermissionSet(PermissionState.Unrestricted).Assert();
}T result = func(); //Undo the grant for full-trust! CodeAccessPermission.RevertAssert(); return result;
另外,在加载任何加载项之前,请确保将主机API加载到受限的AppDomain中。这将避免在找不到主机API组件的情况下。
不隶属于 StackOverflow