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

8

问题概述

我正在支持一个使用Microsoft.ReportViewer库的旧版ASP.NET内部网站应用程序。

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

在报告处理期间发生错误。

分组“list1_Details_Group”的排序表达式包含错误:

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

我的所有研究都表明,这个问题是由于应用程序没有必要的信任级别而引起的(所有相关的堆栈溢出问题都通过将信任级别设置为完整来解决),但是我的Web配置文件将信任级别定义为完整,所以我完全不知道为什么会出现这个错误。

由于安全原因,我无法显示所有的Web配置文件,但其中大部分可以在此处找到:http://pastebin.com/GdJhHDhH。任何缺失的内容都已被注释或存根。

可能有用的细节

此问题是在将应用程序从Forms身份验证迁移到Windows身份验证后出现的。虽然不一定相关,但很难忽视这个巧合。

此问题在我的所有环境中都出现:本地、开发和生产环境(将生产环境回退到Forms身份验证可以使其正常工作)。

该应用程序是使用.Net 4、C#编写的。

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

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

我已经疲惫不堪,任何指导都会很好。

更新:尝试解决方案

尝试删除list1_Details_Group。当这样做时,报告的另一部分会抛出相同的异常。

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

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

尝试在IIS中使用“Classic”托管管道。


就数据库凭据而言,报告服务使用来自Web配置文件的连接字符串。就Windows凭据而言,我们使用公司Nuget存储库中的自定义MembershipProvider。 - Jamie Butler
你尝试过在Windows身份验证中使用模拟吗?我不确定它是否有帮助,但我认为至少值得测试一下。请参见此处 - user1429080
好的,我尝试了为所有相关的程序集进行强命名,但是很遗憾没有成功。 - Jamie Butler
在哪里托管ASP.NET内部网站应用程序?如果在IIS中,则尝试使用“经典”应用程序池而不是“集成”的。 - Gurgen Sargsyan
谢谢Gurgen,我正在IIS中运行它,所以我会尝试一下。 - Jamie Butler
显示剩余5条评论
2个回答

7

好的,我知道这是一篇旧文章。但我遇到了完全相同的问题,并且在任何地方都找不到解决方案,所以我在这里发布我的解决方案。

ASP.NET 4.5,ReportViewer 11。从表单身份验证切换到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 中设置了 Full Trust Set 和所有相关属性,显然,因为它与表单身份验证一起工作。

解决方案

要解决此问题,请按以下方式设置沙盒的权限:

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));

注意:如果您向报告传递参数,您将获得相同的行为;相同的解决方案也适用于此。


非常感谢您的贡献!我无法再访问该系统以确认这个答案是否解决了问题,但还是非常感谢。 - Jamie Butler
本周发布新版本时遇到了这个问题。奇怪的是,与报告生成相关的代码已经在生产中使用了4年以上。新版本的更改并没有涉及此代码。解决方案解决了问题,但在负载下使用它是否存在任何问题? - Stinky Towel

2
可能会出现一些问题。
首先,最明显的是看看错误信息,它说:
“分组 'list1_Details_Group' 的排序表达式存在错误”
让我们先解决这个问题。首先进入 Sorting 属性,并找到相关的组“list1_Details_Group”。如果您已经删除它,但问题仍然存在,则需要查找 .rdl 代码并查找“list1_Details_Group”。如果您找到了它的实例,那么它仍然存在。请清理掉它们。
其他需要注意的事项: 第二件事是您需要查看其他“变量”是否影响了您的设置。据报道,此问题可能由第三方插件或 DLL 引起。您是否添加了任何原始环境中没有的第三方 DLL,而这些 DLL 只在切换到 Windows 认证时才起作用?
希望这些能以某种方式帮助您找到正确的方法。

如果您愿意,请快速阅读一下我的问题评论。我已经尝试过删除list1_Details_Group(包括在代码后台中这样做)。当我这样做时,报告的另一个部分抛出了相同的异常。我会尝试找出是否有其他第三方插件和DLL引起了问题,并让您知道我找到了什么。 - Jamie Butler
我的错,我错过了一些注释。我会留意其他可能的解决方案。祝你好运。 - megamaiku
我知道这有点过头了,但你考虑过重新创建项目并逐个添加代码/组件吗? - megamaiku
这还是我没有尝试过的事情,因为应用程序相当庞大。但是我可以尝试添加运行报告所需的最少组件,看看是否有效,如果有效,慢慢添加其余的应用程序,直到我发现有问题为止。虽然这需要几天的时间,但这将是一项可靠的工作方法,所以我认为我会把它放在最后考虑。 - Jamie Butler
另外,我忘了提到。我查看了任何第三方包,但是唯一使用的Nuget包是Microsoft ReportViewer Common和Microsoft Report Viewer Web Forms包。 - Jamie Butler
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接