c# - 如何阻止此第三方 DLL 在我完全信任的 Web 应用程序中抛出安全异常

标签 c# .net asp.net asp.net-3.5

我正在尝试使用 .NET port of Yahoo's YUI compressor在我的网站上,在我本地的 Windows 7 开发机器上运行。

Web 应用程序正在以完全信任模式运行。此外,在我的 web.config 中,我有以下设置:

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

当我调用这段代码时,它抛出一个安全异常

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

异常详情:

Description: The application attempted to perform an operation not allowed by the security policy. To grant this application the required permission please contact your system administrator or change the application's trust level in the configuration file.

Exception Details: System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.

因为这是我的本地开发机器,所以我可以完全控制服务器设置,并据我所知将所有内容设置为完全信任。

我找到了 one possible solution on 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 枚举可能需要一些位。

关于c# - 如何阻止此第三方 DLL 在我完全信任的 Web 应用程序中抛出安全异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4479047/

相关文章:

c# - 如何拒绝玩家移动某条路径?

c# - 如何在 Asp.net Mvc 网站上存储用户事件?

c# - .NET 中的 N 层架构模式中的哪一层应该填充并发和任务

c# - 使用 EPPlus 生成的 Excel 文件中的内容不可读

.net - Graphics.DrawRectangle 在第二个屏幕上缺少边缘

c# - ASP.NET MVC 5 开发速度太慢

c# - 计时器不会重置为 30 分钟 - 每次我返回此页面时,计时器仍在运行

c# - 使用来自另一个合并词典的合并词典中定义的样式

c# - 具有泛型和继承的编码风格

asp.net - 以编程方式访问 httpRuntime maxRequestLength