1

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

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

我尝试设置 AppDomain 以将包含主机 API 的程序集视为完全信任程序集,同时以受限方式运行加载项,但是当我尝试打开数据库连接时仍然收到 SecurityExceptions。

4

1 回答 1

1

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

  1. 创建一个包含 Host API 的程序集,并允许加载项引用它。

  2. 确保包含 Host API 的程序集在程序集级别具有 [AllowPartiallyTrustedCallers] 属性,并为程序集命名。

  3. 确保主机 API 程序集在 AppDomain 中注册为完全信任程序集(有关如何执行此操作,请参阅链接)。

  4. 确保 Host 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;
    }
    

此外,在加载任何加载项之前,请确保将 Host API 加载到受限制的 AppDomain 中。这将避免无法找到主机 API 程序集的异常。

于 2010-11-10T23:31:37.570 回答