代码之家  ›  专栏  ›  技术社区  ›  CuppM

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

  •  6
  • CuppM  · 技术社区  · 17 年前

    我在本地模式下使用Visual Studio 2008中的ReportViewer控件,其中对象作为数据源。我的类被映射到数据库中的数据表。在对象中,它根据需要加载相关对象。因此,在您尝试使用该属性之前,它会将引用保留为null,然后它会尝试自动从数据库中加载它。这些类使用该系统。数据。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上运行的CLR程序集。网。在创建SqlConnection对象之前,我尝试在代码中添加以下调用(如搜索结果中建议的那样),但它显然没有做任何事情:

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

    有什么想法吗?

    5 回复  |  直到 17 年前
        1
  •  7
  •   Artem Koshelev    15 年前

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

    查看详情 here .

        2
  •  4
  •   CuppM    17 年前

    我找到了解决办法。您可以指定系统。安全。政策。您对LocalReport执行程序集(或具有足够权限的程序集)的证据,以便在执行过程中使用。

    reportViewer.LocalReport.ExecuteReportInCurrentAppDomain(System.Reflection.Assembly.GetExecutingAssembly().Evidence);
    
        3
  •  1
  •   user59004 user59004    17 年前

    以防有人像我在搜索此权限错误时一样偶然发现这一点。 我使用了 Windows窗体应用程序 因为客户用“\COMPUTERNAME\C$\Application.Exe”而不是“C:\Application.Exe”链接了他计算机上我的Application Exe的快捷方式,这导致了系统的故障。安全。由于不受信任的intranet使用而获得权限。

    看见 http://www.duelec.de/blog/?p=236 了解更多信息。

        4
  •  1
  •   pseudocoder Mitch Wheat    12 年前

    Artem上述回答的脚注。..

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

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

        Dim permissions As PermissionSet = New PermissionSet(PermissionState.Unrestricted)
        myReportViewer.LocalReport.SetBasePermissionsForSandboxAppDomain(permissions)
    
        5
  •  0
  •   James Osborn    17 年前

    一个快速的想法是,虽然这不是我见过的错误,但请确保您的Assert与设置资源数据源的代码采用相同的方法:

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

    权限断言不会持续太久,它们可能是一个安全问题,因此尽可能在需要它们的代码附近执行它们最有可能奏效。

    推荐文章