Dot-Net

在 .NET Web 應用程序中實現不受信任的外掛

  • April 10, 2013

我想開發一個接受來自使用者社區的外掛的應用程序,類似於 Chrome 或 Firefox 的做法。這將是一個 Web 應用程序,因此單個使用者的應用程序的每個“實例”都將執行不同的外掛(外掛將作為單例實例載入,但僅對某些使用者是“活動的”)。我計劃在 .NET 中實現該應用程序,並嘗試為外掛模型提出一個體系結構。

這是我想要的屬性:

  • 外掛完全建構在我的核心應用程序之外,作為單獨的程序集。
  • 外掛在它們自己的“鎖定”、低信任環境中執行。可能是一個單獨的 AppDomain。
  • 外掛只能通過我提供的 API 起作用。例如,我會將某種外觀作為介面傳遞給它們,它們只能呼叫它,而不能呼叫任何其他程序集。我不能擁有可以在 Web 伺服器上任意執行操作的外掛,例如影響文件系統。
  • 外掛中的致命崩潰不會影響核心應用程序的穩定性。

似乎 System.AddIn 是我最好的選擇,但我不清楚如何強制載入的外掛僅通過我提供的 API 工作,而不載入任何其他程序集。System.AddIn 是否提供該功能?另外,System.AddIn 可以與 ASP.NET / IIS 一起使用嗎?

除了 System.Addin,我還有哪些其他選擇?

您可以嘗試使用 AppDomains 並處理未處理的異常。為避免 appdomain 崩潰,您必須處理AppDomain.UnhandledException

在上面的連結中,請注意以下語句

從 .NET Framework 4 開始,不會針對破壞程序狀態的異常(例如堆棧溢出或訪問衝突)引發此事件,除非事件處理程序是安全關鍵的並且具有 HandleProcessCorruptedStateExceptionsAttribute 屬性。

因此,您可能需要顯式處理一些配置。

我讀過很多問題,聲稱當子域中的不同執行緒上發生未處理的異常時,會冒泡並關閉父域。如果是這樣,那麼將所有外掛載入到一個單獨的程序中,每個外掛都有一個 appdomain 或將外掛載入到單獨的程序中可能是可取的。

我還遇到了關於 SO 的以下問題,我相信您會覺得很有幫助

看起來您主要關心的是隔離(為了安全性和穩健性)。

因此,您最好的選擇是在單獨的 AppDomain 中啟動您的外掛。在此域中,您可以控制允許載入的程序集(請參閱 AppDomainSetup 類)。

您的主程式碼也將受到保護,不會在外掛內發生任何不愉快的事情:所有外掛方法都必須使用核心對象的副本(除非您傳遞的對像是從 MarshalByRefObject 繼承的,在這種情況下,所有的賭注都是關閉的)。外掛方法中的異常可以通過將所有呼叫包裝在 try except 中,或者通過 AppDomain 的 UnhandledExcption 事件來處理。

請記住,跨越 AppDomain 邊界會降低性能。該呼叫本質上是一個遠端呼叫。

另一個潛在的問題是您打算如何管理 AppDomain。我從未嘗試在一個程序中創建多個 AppDomain,但我預計會遇到麻煩。為單個域中的多個使用者組合外掛將挑戰您嘗試建構的保護

作為對@RationalGeek 問題的回應 - UnhandledException 事件允許這樣做 - 有點。您可以在核心域和外掛域中訂閱此事件,但這樣做存在很多不確定性 - 請參閱我引用的文章了解更多詳細資訊。可能更好的選擇是將對 API 的每次呼叫包裝在 try/except 中

引用自:https://stackoverflow.com/questions/15743452