[英]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 的解決方案是正確的,但您正在查看不同的文件夾/文件
該文件夾應類似於 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\SSRS
您需要編輯的文件是同一位置的 RSPreviewPolicy.config
從@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.