2010-12-18 14 views
3

自分のWebサイトでローカルのWindows 7開発マシンで.NET port of Yahoo's YUI compressorを使用しようとしています。完全な信頼WebアプリケーションでこのサードパーティDLLがセキュリティ例外をスローするのを止める方法

Webアプリケーションが完全信頼モードで実行されています。

<system.web> 
    <trust level="Full" /> 
</system.web> 

私はこのコードを呼び出すと、それはセキュリティ例外

string output = "{someJavaScriptCode:true}"; 
output = JavaScriptCompressor.Compress(output); 

例外の詳細をスロー:

説明:また、私のweb.configに、私はこのセットを持っていますアプリケーション は、セキュリティポリシーによって許可されていない操作を実行しようとしました。 このアプリケーションに必要な 権限を与えるには、 システム管理者に連絡するか、 アプリケーションの信頼レベルを 構成ファイルに変更してください。

例外の詳細: System.Security.SecurityException: タイプ の許可の要求「System.Security.Permissions.SecurityPermission、 mscorlib、バージョン= 2.0.0.0、 ニュートラル文化=、 なPublicKeyToken = b77a5c561934e089 ' が失敗しました。

これは私のローカル開発マシンであるため、私はサーバー設定を完全に制御しており、私が知る限りすべてを完全に信頼できるものにしています。

one possible solution on Googleが見つかりましたが、ソリューションのコードがどこにあるのかわかりません。

解決策はそれほど詳細ではなく、なぜ解決策が機能するのかについては説明がありませんでした。

これを解決する良い方法は誰にも分かりますか?好ましくは、完全なコード例や、私のWebアプリケーションでこの作業を行うために必要なものの良い説明がありますか?

editここでは、例外のスタックトレースが役立ちます。

[SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.] 
    System.Threading.Thread.set_CurrentCulture(CultureInfo value) +38 
    Yahoo.Yui.Compressor.JavaScriptCompressor..ctor(String javaScript, Boolean isVerboseLogging, Encoding encoding, CultureInfo threadCulture, Boolean isEvalIgnored, ErrorReporter errorReporter) +196 
    Yahoo.Yui.Compressor.JavaScriptCompressor.Compress(String javaScript, Boolean isVerboseLogging, Boolean isObfuscateJavascript, Boolean preserveAllSemicolons, Boolean disableOptimizations, Int32 lineBreakPosition, Encoding encoding, CultureInfo threadCulture, Boolean isEvalIgnored) +119 
    Yahoo.Yui.Compressor.JavaScriptCompressor.Compress(String javaScript, Boolean isVerboseLogging, Boolean isObfuscateJavascript, Boolean preserveAllSemicolons, Boolean disableOptimizations, Int32 lineBreakPosition, Encoding encoding, CultureInfo threadCulture) +67 
    Yahoo.Yui.Compressor.JavaScriptCompressor.Compress(String javaScript, Boolean isVerboseLogging, Boolean isObfuscateJavascript, Boolean preserveAllSemicolons, Boolean disableOptimizations, Int32 lineBreakPosition) +112 
    VideoSync.Js.Script.GetOutput(Boolean compress) in [REDACTED]\Script.ashx.cs:78 
    VideoSync.Core.CombinerBase.ProcessRequest(HttpContext c) in [REDACTED]\CombinerBase.cs:28 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +599 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +171 
+2

JavaScriptCompressorクラスを修正して、スレッドのCurrentCultureを変更しないようにするのが最良の解決策です。これは、他のロケールで数字が正しく表示されないようにするために追加されたハック(http://yuicompressor.codeplex.com/workitem/3219)のようです。適切なアプローチは 'ToString呼び出しごとに' CultureInfo.InvariantCultureを使うことです。 –

+0

@Bradley私はあなたの解決策をとることに決めました。このバグの影響を受けたのはYUIコードの2つの場所だけなので、変更するのは本当に簡単な修正でした。私がそれを変更したら、私は文化を設定するためのすべての呼び出しを削除し、すべてが機能しました。株式YUIコードを変更せずに実行できるようにするためには、何が必要かを知りたいのはまだ興味があります。 –

答えて

0

あなたはJavaScriptCompressor.Compressメソッドを呼び出そうとしたあなたの方法にPermissionSet属性を追加する必要があります。

だから、それは次のようになります。

[PermissionSet(SecurityAction.Assert, Unrestricted = true)] 
void CompressSomething() 
{ 
    // ... 

    var result = JavaScriptCompressor.Compress(output); 

    // ... 
} 

これを基本的には、このメソッドのコードはすでに任意の必要なセキュリティチェックを通過したので、それはそれは、内部呼び出しを行うことができるようにすべきであると仮定するCLRに指示します。

このコードにはセキュリティ上の問題があり、.NETのコードアクセスセキュリティについてさらに詳しくお読みいただくことをお勧めします。ここでは便利なリンクがあります:

http://msdn.microsoft.com/en-us/library/930b76w0(v=vs.71).aspx

EDIT - もう一つの提案は、スタックトレースを見た:

問題は、現在のCultureInfoを設定すると、現在のスタック上のSecurityPermission必要であることのようです。

たぶん、次の操作を試してください。

var cas = new SecurityPermission(PermissionState.Unrestricted); 
try 
{ 
    cas.Assert(); 

    // ... 
    var result = JavaScriptCompressor.Compress(output); 
    // ... 
} 
finally 
{ 
    CodeAccessPermission.RevertAssert(); 
} 

それが動作しない場合は、あなたがSecurityPermissionコンストラクタに送るパラメータで再生しよう。たぶん、いくつかのビットは、それに送ることができるSecurityPermissionsFlag列挙型に必要です。

+0

'' [Compress'を呼び出すメソッドに '[[PermissionSet(SecurityAction.Assert、Unrestricted = true)]]'を追加しましたが、同じ例外があります。 –

+0

その場合、例外スタックトレースを投稿できますか?多分それは別のものです。また、あなたが言及したリンクからアセンブリ属性を追加しようとしましたか?または、メソッド属性のみ? – Ran

+0

@Ranまた、私が言及したリンクからアセンブリ属性を追加しました。スタックトレースを含めるように答えを更新しました。 –

関連する問題