受限 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 中的加载项应如何访问升级服务的主要内容,如果未能解决你的问题,请参考以下文章