报表查看器-请求SqlClientPermission类型的权限失败

本文关键字:类型 权限 失败 SqlClientPermission 请求 报表 | 更新日期: 2023-09-27 17:48:48

我在本地模式下使用Visual Studio 2008中的ReportViewer控件,对象作为数据源。我的类被映射到数据库中的数据表。在对象中,它根据需要加载相关对象。因此,它将引用保留为null,直到您尝试使用该属性,然后它尝试自动从数据库加载它。这些类使用System.Data.SqlClient命名空间。

当我与Windows窗体应用程序中的对象进行交互时,一切都能按预期进行。但是,当我传递要用作报表数据源的对象,并且它试图自动加载相关对象时,它失败了。该代码创建了一个SqlConnection对象,当我对它调用GetCommand()时,会引发以下异常:

[System.Security.SecurityException] {
"Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed."
} System.Security.SecurityException

我尝试搜索错误,但显示的所有结果都是针对SQL Server或ASP.Net上运行的CLR程序集。在创建SqlConnection对象之前,我尝试在代码中添加以下调用(如搜索结果所示),但它显然没有起到任何作用:

System.Data.SqlClient.SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();

有什么想法吗?

报表查看器-请求SqlClientPermission类型的权限失败

除了CuppM的答案。ExecuteReportInCurrentAppDomain方法由于.NET4而被弃用,应该使用LocalReport.SetBasePermissionsForSandboxAppDomain,因为ReportViewer现在总是在沙盒域中执行:

PermissionSet permissions = new PermissionSet(PermissionState.None);
permissions.AddPermission(new FileIOPermission(PermissionState.Unrestricted));
permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
ReportViewer1.LocalReport.SetBasePermissionsForSandboxAppDomain(permissions);

请在此处查看详细信息。

我找到了解决方案。您为LocalReport指定了System.Security.Policy.执行程序集(或具有足够权限的程序集)的证据,以便在执行过程中使用。

reportViewer.LocalReport.ExecuteReportInCurrentAppDomain(System.Reflection.Assembly.GetExecutingAssembly().Evidence);

以防有人像我在搜索此权限错误时一样偶然发现此错误。我在使用Windows窗体应用程序时出现此错误,因为客户在其计算机上用"''COMPUTERNAME''C$''Application.Exe"而不是"C:''Application.Exe"链接了一个到我的Application Exe的快捷方式。-由于不受信任的intranet使用,这导致System.Security.Permission失败。

请参阅http://www.duelec.de/blog/?p=236了解更多信息。

上面Artem答案的脚注。。。

在将Windows身份验证添加到我的asp.net应用程序时,我遇到了这个问题。以框架4.5为目标并使用报告组件11。当我允许匿名用户(在早期开发中)时,我使用ReportViewer没有问题。一旦我启用Windows身份验证,我就会在分组表达式上得到"#Error",或者根本无法运行报告,出现上面列出的异常。

我能够解决这个问题,但对Artem发布的内容进行了轻微修改。除了允许CAS信任沙盒ReportViewer代码之外,我不完全确定该代码的作用。如有任何意见,请稍作解释。

    Dim permissions As PermissionSet = New PermissionSet(PermissionState.Unrestricted)
    myReportViewer.LocalReport.SetBasePermissionsForSandboxAppDomain(permissions)

快速思考一下,尽管这不是我见过的错误,但请确保您的Assert与设置资源数据源的代码使用相同的方法:

System.Data.SqlClient.SqlClientPermission mPermission = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
try
{
    mPermission.Assert();
    //rest of your code
}
//Handle Exceptions

权限断言不会停留很长时间,它们可能是一个安全问题,因此尽可能靠近需要它们的代码进行操作最有可能奏效。