次の環境を想像してください: 部分信頼モードで実行されているXBAPアプリケーション (デフォルトの動作。完全な信頼を要求することはオプションではありません。ただし、質問する前に、XBAP に完全な信頼が与えられている場合、すべてが期待どおりに機能します) は、ローカルにインストールされたアセンブリを参照しています。 、GAC にあります。これを実現するためAllowPartiallyTrustedCallers
に、ローカル アセンブリに対して " " オプションを有効にし、完全な信頼も付与します。(これがある種のローカル接続対応物であると想像してください)
(ちなみに、私たちは AllowPartiallyTrustedCallers 属性を使用することのセキュリティ面を認識していますが、これはこの投稿の範囲外ですが、気にしないでください)
ここで、ローカル GAC アセンブリが完全に信頼されていても(いつでも呼び出すことAssembly.GetExecutingAssembly().IsFullyTrusted
でこれを確認できます)、部分的に信頼された呼び出し元 (XBAP) によって呼び出されるため、要求 (暗黙的または明示的) は失敗します。(何か誤解している場合は訂正してください) . 幸いなことに、明示的なアサートを実行して、ローカル GAC アセンブリ内でアクセス許可を取得できます。次に例を示します。
new System.Security.Permissions.FileIOPermission(.....).Assert();
これにより、この時点で完全なスタック ウォーク オン デマンドを回避し、必要に応じてファイル アクセスを実行できます。(繰り返しますが、私を修正してください...) これは実際には完全に機能します! (この場合)
問題は、ファイル IO をまったく行わないことです。実際、外部ライブラリを呼び出しているため、必要なことは何でも実行できます (レジストリへのアクセス、Web サービス要求の作成、書き込みなど、多くのことを行う可能性があります)。ファイルを呼び出し、アンマネージ コードを呼び出します (詳しくはわかりませんが、信頼できます)。部分的に信頼された呼び出し元に到達するためのデマンド スタック ウォークを防ぎます。すべてがローカルにインストールされた信頼できる GAC アセンブリから行われるため、これを実現できるはずです。(繰り返しになりますが、ここではセキュリティの側面は気にしないでください。クライアントを信頼できると仮定してください)
これを解決するためのアプローチ:
私たちが最初に考えたのは、外部ライブラリを操作する前に、ほぼすべてのアクセス許可に対して一連のアクセス許可 (PermissionSet) をアサートすることでした。これはほとんど機能しますが、外部ライブラリが何らかの理由で失敗するスレッドをさらに開始する可能性があるため、または entryassembly にアクセスするために、ある時点でまだセキュリティ例外が発生しているようです。実際にはわかりません。
次に、次の属性を試しました
[System.Security.Permissions.PermissionSet(
System.Security.Permissions.SecurityAction.Assert, Name = "FullTrust")]
それもうまくいきませんでした。
3 番目に、新しい AppDomain を開き、完全に信頼された GAC アセンブリを AppDomains エントリ ポイントにして、この appdomain 内で何かを実行することを考えました。残念ながら、これを達成することはできません... または、新しく作成された AppDomain は、「MyComputer」セキュリティ ゾーン Evidence または無制限の SecurityPermission で実行するように設定されていても、さらに多くの要求に失敗します。AppDomain 全体に完全な信頼を明示的に付与することはできません。
第 4 に、caspolの使用はオプションではありません。(配置上の理由により)
さて、これは多くの情報になるはずなので、私たちがアーカイブしたいことを理解していただければ幸いです.
要点を言えば、完全に信頼されたアセンブリは、部分的に信頼された呼び出し元に到達するためにすべてのスタック ウォークを停止して、それが呼び出すアセンブリに完全な完全な信頼をどのようにアサートできるのでしょうか?
事前に多くの感謝