簡體   English   中英

如何阻止此第三方DLL在我的完全信任Web應用程序中拋出安全例外

[英]How can I stop this third-party DLL from throwing Security Exceptions in my full trust web application

我正在嘗試在我的網站上使用Yahoo YUI壓縮器.NET端口 ,在我的本地Windows 7開發機器上運行。

Web應用程序以完全信任模式運行。 另外,在我的web.config ,我有這個集合:

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

當我調用此代碼時,它會拋出一個安全異常

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

例外細節:

說明:應用程序嘗試執行安全策略不允許的操作。 要授予此應用程序所需的權限,請與您的系統管理員聯系或在配置文件中更改應用程序的信任級別。

異常詳細信息: System.Security.SecurityException:請求類型為'System.Security.Permissions.SecurityPermission,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'的權限失敗。

由於這是我的本地開發機器,因此我可以完全控制服務器設置,並將所有內容設置為完全信任,據我所知。

在Google上找到了一個可能的解決方案 ,但我不明白解決方案的代碼應該去哪里。

解決方案不是很詳細,也沒有提供解決方案工作原理的任何解釋。

有誰知道解決這個問題的好方法? 最好使用完整的代碼示例或對在我的Web應用程序中使其工作所需的內容有一個很好的解釋?

編輯這是異常的堆棧跟蹤,以防它有用。

[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

您應該將PermissionSet屬性添加到嘗試調用JavaScriptCompressor.Compress方法的方法中。

所以它看起來像這樣:

[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

編輯 - 看到堆棧跟蹤的另一個建議:

問題似乎是設置當前的CultureInfo需要當前堆棧上的SecurityPermission

也許嘗試以下方法:

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

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

如果它不起作用,請嘗試使用您發送到SecurityPermission構造函數的參數。 也許你可以發送給它的SecurityPermissionsFlag枚舉上需要一些位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM