繁体   English   中英

SSRS 自定义程序集权限问题

[英]SSRS Custom Assembly Permissions issue

我正在尝试创建一个自定义 SSRS 程序集,该程序集根据 SQL 表的值格式化报告的样式。

我需要能够在本地预览并部署到报告服务器。

这将允许我从一个中心位置对一系列分页报告进行样式更改。

示例表达式: =ProjectName.ClassName.getItemStyle("Header", "Font-Family")该表达式解析我要查找的值,然后从 SQL 表中返回一个值,在本例中为“Verdana”。

我已经通过各种步骤来使其正常工作,现在已经遇到权限问题。 只要我不尝试连接到 SQL 服务器,该组件就可以正常工作。

在这种情况下,我收到此错误:

textrun 'Textbox1.Paragraphs[0].TextRuns[0]' 的值表达式包含错误:请求类型'System.Data.SqlClient.SqlClientPermission, System.Data, Version=4.0.0.0, Culture=的权限中立,PublicKeyToken=b77a5c561934e089' 失败。

我尝试添加程序集权限并编辑 rssrvpolicy 配置文件无济于事,但我觉得我遗漏了一些东西,我不太确定我是否了解 Microsoft 文档。

我还签署了程序集并安装了证书。

我用过的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.IO;
using System.Xml;
using System.Security;
[assembly: AllowPartiallyTrustedCallers]

namespace CC_rpt
{   
    public class lib
    {
        public static string getItemStyle(string parse)
        {
            string val;
            val = "1";

            try
            {              
                using (SqlConnection oConn = new SqlConnection("Data Source=DBServer;Initial Catalog=DBName;Integrated Security=SSPI"))
                {
                    var oCmd = new System.Data.SqlClient.SqlCommand();
                    oCmd.Connection = oConn;
                    oCmd.CommandText = "select singleValue FROM Table WHERE Column = @Param";
                    oCmd.Parameters.AddWithValue("@Param", parse);
                    val = oCmd.ExecuteScalar().ToString();
                }
            }

            catch (System.Data.SqlClient.SqlException e)
            {
                val = e.ToString();
            }

            return val;
        }
    }
}

操作系统:Windows 7 企业版 6.1(内部版本 7601:Service Pack 1)

Visual Studio :Microsoft Visual Studio Professional 2017 版本 15.9.13

服务器SSRS 报告服务 2016

已安装产品
SQL 服务器报告服务 15.0.1528.0 SQL 服务器集成服务 15.0.1300.371

我主要尝试使用的.Net 库: System.Data.SqlClient目标.Net Framework:4.6.1

我将 DLL 复制到的路径(通过构建后事件)*:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\CommonExtensions\MSBuild C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\PrivateAssemblies C:\Program文件 (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Reporting Services C:\Program Files 2017\Professional\Common7\IDE\CommonExtensions\Microsoft\SSRS C:\Program Files\Microsoft SQL 服务器\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\bin

程序集安全设置:我已经签署了程序集,创建了字符串密钥文件 (pfx) 并安装了它。

如果您在使用 Visual Studio 预览时遇到问题,那么来自 @bergerb 的解决方案是正确的,但您正在查看不同的文件夹/文件

  1. 该文件夹应类似于 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\SSRS

  2. 您需要编辑的文件是同一位置的 RSPreviewPolicy.config

  3. 从@bergerb 添加此代码

<CodeGroup class="UnionCodeGroup" version="1" PermissionSetName="FullTrust" Name="DBAccessPermissionCodeGroup" Description="A special code group for my custom assembly.">
    <IMembershipCondition class="UrlMembershipCondition" version="1" Url="c:\Program Files\Microsoft SQL Server Reporting Services\SSRS\ReportServer\bin\Your_Custom_DLL_Name.dll" />
</CodeGroup>

好的。 同样的问题,30 Firefox 选项卡稍后:

我的旅程从这里开始: http://bryantlikes.com/WritingCustomCodeInSQLServerReportingServices.aspx

您需要在此文件中添加 CodeGroup: c:\Program Files\Microsoft SQL Server Reporting Services\SSRS\ReportServer\rssrvpolicy.config

无法真正让它与自定义权限集一起使用,所以我使用了 FullTrust。 也许不是最干净的?

我的 CodeGroup 的最新版本如下所示:

<CodeGroup class="UnionCodeGroup" version="1" PermissionSetName="FullTrust" Name="DBAccessPermissionCodeGroup" Description="A special code group for my custom assembly.">
    <IMembershipCondition class="UrlMembershipCondition" version="1" Url="c:\Program Files\Microsoft SQL Server Reporting Services\SSRS\ReportServer\bin\Your_Custom_DLL_Name.dll" />
</CodeGroup>

顺便说一句:检查 dll 的 url,可能看起来很明显,但是,别问我怎么知道的。

然后你必须将你的方法(和/或类?)标记为[SecuritySafeCritical] ,因为 SSRS 的 Expression thingy 作为 SecurityTransparent 运行。 https://stackoverflow.com/a/34850214/11829240

如果你不这样做,你会得到一个错误,上面写着Cannot perform CAS Asserts in Security Transparent methods

而且您还想将以下属性添加到使用 SQL 东西的方法[SqlClientPermission(System.Security.Permissions.SecurityAction.Assert, Unrestricted = true)]

如果你忽略它,你将得到你所遇到的错误。

在我的 AssemblyInfo.cs 中,我添加了[assembly:AllowPartiallyTrustedCallers] ( https://stackoverflow.com/a/19214614/11829240 )

不知道有没有必要,但是my.dll是签名的。

完成后,我在 SQL 服务器中启用了 TCP/IP 并创建了一个新用户(并启用了 SQL-Server 身份验证)。

顺便说一句:为了调试#Error 消息,我使用了 prodcump。 ./procdump.exe -f "" -l -e 1 ReportingServicesService.exe

https://docs.microsoft.com/en-us/sysinternals/downloads/procdump

我希望这对某人有所帮助,因为研究起来并不有趣。 但是现在我的自定义程序集终于可以工作了。

我的连接字符串: Data Source=localhost,1433;Initial Catalog=database;User Id=user;Password=pass;

这个 PermissionSet 对我不起作用:

<PermissionSet class="NamedPermissionSet" version="1" Name="DBAccessPermissionSet" Description="A special permission set that grants access to Databases.">
  <IPermission class="SqlClientPermission" version="1" Unrestricted="true" />
  <IPermission class="SecurityPermission" version="1" Flags="Execution, Assertion" />
</PermissionSet>

它还以某种方式引发Cannot perform CAS Asserts in Security Transparent methods错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM