ASP.NETアセンブリごとにページごとに信頼レベルが変化しますか?
-
28-10-2019 - |
質問
2つのWebアプリケーション(事前コンパイルされたサイト)があります。1つはファーストパーティで、完全な信頼で実行されます。もう1つはサードパーティで、部分的な信頼(または特定の権限)で実行する必要があります。
TrustedAssembly.Web.Pages.MyPage
完全なトラストデフォルトのAppDomainで実行する必要があります。UntrustedAssembly.Web.Pages.SomePage
部分的な信頼appdomainで実行する必要があります。
さらに、場合 TrustedAssembly.Web.Pages.MyPage
動的にロードします UntrustedAssembly.Web.Controls.SomeControl
ページは完全な信頼の下で実行されている間、部分的な信頼および/または特定の権限でコントロールを実行することは可能ですか?
その逆も同様です UntrustedAssembly.Web.Controls.SomePage
動的にロードします TrustedAssembly.Web.Controls.MyControl
, 、ページが部分的な信頼の下で実行されている間、完全に信頼してコントロールを実行することは可能ですか?
更新/FYI:これは.NET 4です
解決
これを行うことは少し難しい可能性があります。考えられる2つの考え方は次のとおりです。
1つ目は、アプリをMedium Trustで実行することですが、GACで完全に信頼して実行したいものと、Binで部分的な信頼で実行したいものを配置することです。
「逆」シナリオでは、完全な信頼操作を実行する前に、信頼できるコントロールがセキュリティを実行する必要がある場合があることに注意してください。例えば
(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode)).Assert();
2番目の考え方は、アプリを完全に信頼して実行することですが、カスタムを使用して中程度の信頼で実行したいアセンブリをロードすることです 証拠. 。例えば
var evidence = new Evidence();
// Initialize the Evidence
Assembly.LoadFrom(path, evidence);
しかし、証拠オブジェクトを正しくセットアップすることは心のかすかな人のためではないことに注意してください。私はその道をするかどうかはわかりません。
完全な答えではありませんが、うまくいけば、それにつながる可能性のあるいくつかのアイデア:)
他のヒント
David Ebboへの+1 -Partial Trustの下でアプリ全体を実行し、Gaced Assemblyからの呼び出しの向上は正気です。
考えるべきいくつかのポイント...
- AppDomains間にリモートするように設計されているクラスは多くありません。 asp.netのものはあまりリモートできません...
- ASP.NETコントロールには、ランタイムと非常に多くの統合ポイントがあります。コントロールとランタイム間の相互作用を適切に制限するために、非常に興味深いプロキシクラスを構築して、潜在的な標高を回避し、クロスドメインのマーシャリングを正しくする必要があります。
- ドメインの境界を越えて他のアセンブリからクラスを「リーク」するのは簡単です(カスタムの場所からのカスタムロードは、障害をより明白にすることで「リーク」を防ぐのに役立ちます)。 ASP.NETのような多くのエタンションポイント(オーバーライド、イベント)を備えたフレームワークを使用すると、オブジェクトクロスドメインをもたらす機会が増えます。
- これは、プロセスで任意のコードを実行するのに役立ちません。プロセスにロードするだけで、カスタムコードに信頼(非CLRの感覚)を宣言します。 IE StackOverFlowは、権限を実行しただけで、プロセスを確実に削減するコードによって拡大可能です。