【发布时间】:2016-01-18 08:16:35
【问题描述】:
我正在构建一个 SQL Server Reporting Services (SSRS) 报告。查看报告的最终用户可以选择某些输入参数,在这种情况下是位置。用户可以选择的位置取决于 Active Directory 组成员身份,因此我尝试在自定义报告函数中声明组成员身份。
(由于报告使用连接到 Oracle 数据库的通用数据源,因此不能将组成员身份委派给数据库)
我在概念验证报告中编写了以下自定义代码:
Function CheckRight(name As String) As String
Try
Dim nameParts = name.Split("/")
Dim user = name(1) + "@" + name(0)
Dim inrole As Boolean = IsInGroup(user, "Domain Users")
Return Iif(inrole, "Yes", "No")
Catch ex As Exception
Return ex.Message
End Try
End Function
Function IsInGroup(user As String, group As String) As Boolean
Dim identity AS System.Security.Principal.WindowsIdentity
identity = New System.Security.Principal.WindowsIdentity(user)
Dim principal = New System.Security.Principal.WindowsPrincipal(identity)
Return principal.IsInRole(group)
End Function
我正在使用表达式在报告中显示结果:
=Code.CheckRight(User!UserID)
不显示“是”或“否”,而是显示错误:
请求“System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”类型的权限失败。
(或荷兰语:'De aanvraag voor machtiging van type System.Security.Permissions.SecurityPermission, mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089 是错误的。')
我使用的是 Visual Studio 2012,所以我的 PrivateAssemblies 位于 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\PrivateAssemblies。
回答
基于adriano-repetti的回答
我编辑了 PrivateAssemblies\RSPreviewPolicy.config,并让它在本地工作:
<NamedPermissionSets>
<!-- added this extra permission set at the bottom: -->
<PermissionSet
class="NamedPermissionSet"
version="1"
Name="PermissionSetForIsInRole"
Description="Permission set that grants rights to WindowsPrincipal.IsInRole.">
<IPermission
class="SecurityPermission"
version="1"
Flags="Execution,ControlPrincipal"/>
</PermissionSet>
</NamedPermissionSets>
<PolicyLevel>
<Codegroup class="FirstMatchCodeGroup" ...>
<CodeGroup
class="FirstMatchCodeGroup"
version="1"
PermissionSetName="Nothing">
<IMembershipCondition
class="AllMembershipCondition"
version="1"
/>
<!-- changed 'Execution' to 'PermissionSetForIsInRole' here: -->
<CodeGroup
class="UnionCodeGroup"
version="1"
PermissionSetName="PermissionSetForIsInRole"
Name="Report_Expressions_Default_Permissions"
Description="This code group grants default permissions for code in report expressions and Code element. ">
<IMembershipCondition
class="StrongNameMembershipCondition"
version="1"
PublicKeyBlob="0024000..."
/>
</CodeGroup>
</CodeGroup>
</PolicyLevel>
一些注意事项
- 不要试图断言正确。这导致“无法在安全透明方法中执行 CAS 断言”,原因在 adriano-repetti 的答案中描述。
- 可能还可以修改“执行”权限。
- https://msdn.microsoft.com/en-us/library/ms154466.aspx 警告“调用外部程序集或受保护资源的代码应合并到自定义程序集中以在报告中使用。这样做可以让您更好地控制代码请求和声明的权限。您不应调用内部的安全方法Code 元素。这样做需要您将 FullTrust 授予报表表达式主机,并授予所有自定义代码对 CLR 的完全访问权限。"
- 可以在https://msdn.microsoft.com/en-us/library/system.security.permissions.securitypermissionflag(v=vs.110).aspx 找到可能的安全标志列表
- RSPreviewPolicy.config 仅在本地使用,用于本地预览。在生产环境中,您需要编辑 C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\bin\RSReportServerServices.exe.config。根据https://msdn.microsoft.com/en-us/library/bb630448.aspx - 我还没有这样做。
【问题讨论】:
标签: .net reporting-services ssrs-2012