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

时间:2010-11-10 19:53:02

标签: .net security appdomain maf

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

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

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

1 个答案:

答案 0 :(得分:1)

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

  1. 创建一个包含Host API的程序集,并允许加载项引用它。
  2. 确保包含Host API的程序集在程序集级别上具有[AllowPartiallyTrustedCallers]属性,并强烈命名程序集。
  3. 确保Host API程序集已在AppDomain中注册为完全信任程序集(有关如何执行此操作,请参阅http://blogs.msdn.com/b/shawnfa/archive/2005/08/08/449050.aspx)。
  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;
    
    }
  6. 此外,在加载任何加载项之前,请确保将Host API加载到受限制的AppDomain中。这样可以避免无法找到Host API程序集的异常。