使用Microsoft Report Viewer:请求类型为System.Security.Permissions.SecurityPermission'的权限。失败

时间:2016-09-22 04:36:27

标签: c# asp.net .net permissions reportviewer

问题摘要

我支持使用Microsoft.ReportViewer库的旧版ASP.NET Intranet Web应用程序。

运行时,报告会抛出以下错误:

  

报告处理期间发生错误。

     

分组'list1_Details_Group'的Sort表达式包含错误:

     

请求类型的许可:   ' System.Security.Permissions.SecurityPermission,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'失败。

我的所有研究都表明,这个问题源于应用程序没有必要的信任级别(所有相关的堆栈溢出问题都是通过将信任级别设置为完全来解决的),但是我的Web配置定义了完整的信任级别,所以我&# 39; m完全失去了为什么会发生这种错误。

出于安全原因,我无法显示所有网络配置,但其中大部分都可以在此处找到:http://pastebin.com/GdJhHDhH任何遗漏的内容都已被评论或存根。

潜在有用的详情

将应用程序从“表单身份验证”迁移到Windows身份验证后出现此问题。不一定相关,但很难忽视巧合。

在我的所有环境中都会出现此问题:Local,Dev和Prod(将prod返回到Forms身份验证使其工作)。

该应用程序是用.Net 4,C#

编写的

报告代码与Web应用程序位于不同的程序集中,Web应用程序引用报告程序集。

Web应用程序在与报告无关的应用程序的其他区域中成功检索数据库中的其他数据。

我的智慧结束了,任何指导都会很棒。

更新:尝试解决方案

尝试删除list1_Details_Group。完成此操作后,报告的另一部分将抛出相同的异常。

尝试使用Windows身份验证进行模拟。应用程序继续以相同的方式工作,同时在报告中抛出相同的异常。

强烈尝试命名应用程序中使用的所有程序集。否应用程序继续以相同的方式工作,同时在报告中抛出相同的异常。

尝试使用" Classic" IIS中的托管管道。

2 个答案:

答案 0 :(得分:2)

可能会发生一些问题。

第一个也是最明显的,看看错误,它说

  

分组'list1_Details_Group'的排序表达式包含错误

让我们先解决这个问题。首先转到Sorting属性,找到关联的组 list1_Details_Group 。如果您已删除它并且问题仍然存在,那么您将不得不查看.rdl代码并执行 list1_Details_Group 的查找。如果您找到它的实例,则意味着它仍然存在。清理那些。

附加说明: 您需要关注的第二件事是其他“变量”可能会影响您的设置。 reported这个问题可能是由第三方=派对插件或DLL引起的。您是否添加了任何不属于仅在切换到Windows身份验证时发挥作用的原始环境的第三方DLL?

希望这有助于您走上正确的道路。

答案 1 :(得分:2)

好的,我知道这是一个旧帖子。但是我开始遇到完全相同的问题,找不到在任何地方发布的任何解决方案,因此我将解决方案发布在这里。

ASP.NET 4.5,ReportViewer11。从窗体身份验证转移到Windows身份验证。在窗体身份验证中,对报表进行排序可以正常工作,但是Windows身份验证出现安全/权限错误。

我能够在Windows Server 2012 R2和本地Windows 10开发环境(Visual Studio 2015)上重现以上内容。

我发现,只有在使用SortExpression对多个列进行排序时,才会出现此问题,如下所示:

=Fields!glp.Value & Fields!building_number.Value & Fields!room_number.Value

如果我只对没有排序表达式的字段进行简单排序,那么一切正常。

我的Web.config中具有完全信任集和所有相关属性-显然是因为它与Forms Authentication一起使用。

解决方案

要解决此问题,请按以下步骤设置沙箱的权限:

rvReservations.ProcessingMode = ProcessingMode.Local;
LocalReport local_report = rvReservations.LocalReport;
local_report.ReportPath = "Reports\\rReservations.rdlc";
local_report.DataSources.Clear();

local_report.SetBasePermissionsForSandboxAppDomain(new System.Security.PermissionSet(System.Security.Permissions.PermissionState.Unrestricted));

注意: :如果将参数传递给报表,您将得到相同的行为;相同的解决方案也适用。