受限 AppDomain 中的加载项应如何访问升级服务

Posted

技术标签:

【中文标题】受限 AppDomain 中的加载项应如何访问升级服务【英文标题】:How should add-ins in restricted AppDomains access escalated services 【发布时间】:2010-11-10 19:53:01 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

以上是关于受限 AppDomain 中的加载项应如何访问升级服务的主要内容,如果未能解决你的问题,请参考以下文章

C# 防止 AppDomain 程序集的类实例访问文件

受限 AppDomain 中的 C# 类继承自位于主 AppDomain 中的其他类

为啥新的 AppDomain 会加载不必要的 DLL?

从 AppDomain 获取静态列表

插件加载到 appDomain 的 mySQL 错误

如何正确访问当前 AppDomain 的 PrivateBinPath 属性?