簡體   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