我目前使用MAF创建一个加载项模型,其中加载程序被加载到受限的AppDomain(Internet许可)中。这意味着加载项无法调用我们的数据库,这在大多数情况下是我们想要的,因为我们希望防止直接针对DB运行任何查询的加载项作者。

我们希望他们使用某种形式的主机API,以使他们能够执行某些任务(例如运行非常具体的查询或发送电子邮件)。谁能告诉我最好的方法?

我尝试设置AppDomain以处理包含主机API作为完整信任程序集的组件,同时以有限的方式运行加载项,但是当我尝试打开DB连接时,我仍然会获得SecurityExceptions。

有帮助吗?

解决方案

好的,我设法解决了这个问题。对于需要知道的人:

  1. 在其中使用主机API创建一个组件,并允许加载项引用它。
  2. 确保包含主机API的组件具有在组件级别上的[允许partallyTrustedCallers]属性,并将其强名称为组件。
  3. 确保主机API程序集已在AppDomain注册为完整的信托组件(请参阅 http://blogs.msdn.com/b/shawnfa/archive/2005/08/08/449050.aspx 关于如何做到这一点)。
  4. 确保主机API上需要升级权限的方法装饰 SecuritySafecritical 属性(.NET 4)。
  5. 在每种方法开始时需要完全信任,您需要升级的权限,然后直接删除需求。下面的代码提供了一种将授权的方法,该方法将完全信任地运行。

    /// <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组件的情况下。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top