【问题标题】:Using Microsoft Report Viewer: Request for the permission of type 'System.Security.Permissions.SecurityPermission' Failed使用 Microsoft 报告查看器:请求“System.Security.Permissions.SecurityPermission”类型的权限失败
【发布时间】:2017-01-30 12:26:58
【问题描述】:

问题总结

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

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

报告处理过程中发生错误。

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

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

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

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

可能有用的详细信息

此问题是在将应用程序从 Forms Authentication 迁移到 Windows Authentication 后出现的。不一定相关,但很难忽略巧合。

这个问题发生在我的所有环境中:本地、开发和生产(将生产回溯到表单身份验证使这项工作正常进行)。

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

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

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

我对此束手无策,任何指导都会很棒。

更新:尝试的解决方案

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

尝试使用带有 Windows 身份验证的模拟。应用程序继续以相同的方式工作,但在报告中引发了相同的异常。

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

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

【问题讨论】:

  • 如何将凭据或身份验证传递给报告服务?
  • 就数据库凭据而言,报告服务使用来自 Web 配置的连接字符串。在 Windows 凭据方面,我们使用我公司 Nuget 存储库中的自定义 MembershipProvider。
  • MembershipProvider 仅用于/需要用于表单身份验证。 Windows 身份验证应该在没有任何额外代码的情况下对用户进行身份验证(至少这是我的理解)。
  • 您是否尝试过将模拟与 Windows 身份验证结合使用。我不确定它是否会有所帮助,但我认为至少值得测试。见here
  • 如果您从报告中删除list1_Details_Group 会发生什么情况,您是否会在报告的另一部分收到相同的错误?程序集是否强命名:blogs.msdn.microsoft.com/shawnfa/2003/06/20/… 虽然this answer 是 WinForms 而你的是 Web,但它有一些权限可以尝试,你也尝试过 policyFile,例如:<trustLevel name="RosettaSrv" policyFile="rssrvpolicy.config" /

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


【解决方案1】:

可能会发生一些问题。

第一个也是最明显的,看看错误,上面写着

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

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

补充说明: 您需要研究的第二件事是其他“变量”可能会影响您的设置。 reported 表示此问题可能是由第三方插件或 DLL 引起的。您是否添加了任何第三方 DLL,这些 DLL 不属于仅在切换到 Windows 身份验证时才发挥作用的原始环境的一部分?

希望这能以任何方式帮助您走上正轨。

【讨论】:

  • 如果您愿意,可以快速阅读有关我的问题的 cmets。我试过删除 list1_Details_Group (包括在代码隐藏中这样做)。当我这样做时,报告的不同部分引发了相同的异常。我会尝试找出是否有任何其他 3rd 方插件和 DLL 导致该问题,并让您知道我发现了什么。
  • 我的错,我错过了一些 cmets。我会留意其他可能的解决方案。祝你好运。
  • 我知道这有点矫枉过正,但是您是否考虑过 recreating 项目并一一添加代码/组件?
  • 我还没有尝试过,因为应用程序相当大。但我也许可以尝试添加运行报告所需的最少组件,看看是否可行,如果可行,请慢慢添加应用程序的其余部分,直到我看到它坏了。不过,这几天的工作会很充实,所以我想我会把它留到最后的手段。
  • 另外,我忘了提。我查看了任何第 3 方包,但唯一使用的 Nuget 包是 Microsoft ReportViewer Common 和 Microsoft Report Viewer Web Forms 包。
【解决方案2】:

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

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 中有完全信任集 和所有相关属性——显然,因为它适用于表单身份验证。

解决方案

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

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

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

【讨论】:

  • 非常感谢您的贡献!我无法再访问此系统以确认此答案是否解决了问题,但无论如何感谢。
  • 本周发布了一个新版本,遇到了这个问题。奇怪的是与生成报告相关的代码已经生产了 4 年多。新版本更改不涉及此代码。该解决方案解决了该问题,但对在负载下使用它的生产有任何顾虑吗?
猜你喜欢
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多