.net - 在 .NET Web 应用程序中实现不受信任的插件

标签 .net plugins architecture add-in

我想开发一个接受来自用户社区的插件的应用程序,类似于 Chrome 或 Firefox 的做法。这将是一个 Web 应用程序,因此各个用户的应用程序的每个“实例”将运行不同的插件(插件将作为单例实例加载,但仅对某些用户“事件”)。我计划在 .NET 中实现该应用程序,并尝试为插件模型提出一个架构。

这是我想要的属性:

  • 插件完全在我的核心应用程序之外构建,作为单独的程序集。
  • 插件在自己的“锁定”、低信任环境中运行。可能是一个单独的AppDomain。
  • 插件只能通过我提供的 API 进行操作。例如。我将向它们传递某种外观作为接口(interface),它们只能调用该外观,而不能调用任何其他程序集。我不能拥有可以在网络服务器上任意执行操作的插件,例如影响文件系统。
  • 插件中的致命崩溃不会影响核心应用程序的稳定性。

似乎 System.AddIn 是我最好的选择,但我不清楚如何强制加载的插件仅通过我提供的 API 工作,而不加载任何其他程序集。 System.AddIn 提供该功能吗?另外,System.AddIn 可以与 ASP.NET/IIS 一起使用吗?

除了 System.Addin 之外,我还有哪些其他选项?

最佳答案

看来您最关心的是隔离(为了安全性和鲁棒性)。

因此,您最好的选择是在单独的 AppDomain 中激活您的插件。在此域中,您可以控制允许加载哪些程序集(请参阅 AppDomainSetup 类)。

您的主代码也将受到保护,免受插件内发生的任何意外情况的影响:所有插件方法都必须使用核心对象的副本(除非您传递的对象是从 MarshalByRefObject 继承的,在这种情况下,所有的赌注都是离开)。插件方法中的异常可以通过将所有调用包装在 try except 中或通过 AppDomain 的 UnhandledExcption 事件来处理。

请记住,跨越 AppDomain 边界会带来性能损失。该调用本质上是远程调用。

另一个潜在的问题是您计划如何管理 AppDomain。我从未尝试在一个进程中创建多个 AppDomain,但我预计这里会遇到麻烦。在单个域中组合多个用户的插件会对您尝试构建的保护提出挑战

回应@RationalGeek问题 - UnhandledException event允许这样做 - 有点。您可以在核心域和插件域中订阅此事件,但这样做存在很多不确定性 - 请参阅我引用的文章以获取更多详细信息。可能更好的选择是将每次对 API 的调用包装在 try/except 中

关于.net - 在 .NET Web 应用程序中实现不受信任的插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15743452/

相关文章:

c# - 为什么嵌套循环中的方法仅在第一个循环的迭代中被调用!

c# - 带有 TPH 和枚举的 Entity Framework 中的多个 CASE WHEN

c# - 当基本词以 I 开头时,如何命名接口(interface)?

javascript - 为什么 ondragover 在 jQuery 插件中不起作用?

android - Application Framework 和库中的 Manager 类是做什么的?

architecture - 拥有仅包含静态方法的模型有意义吗?

c# - 如何在 Google Drive SDK 中获取文件修订的内容?

plugins - 个人 Wiki、TiddlyWiki5 和 MediaWiki 语法

php - 未添加 Wordpress 过滤器

Selenium GRID 与 TestNG 并行