【问题标题】:Check Acive Directory Group Membership form within SSRS Report Custom Code检查 SSRS 报告自定义代码中的 Active Directory 组成员资格表单
【发布时间】: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>

一些注意事项


【问题讨论】:

    标签: .net reporting-services ssrs-2012


    【解决方案1】:

    WindowsPrincipal.IsInRole() 方法需要SecurityPermissionFlag.ControlPrincipal 权限,默认情况下不会授予报告中的自定义代码。

    您可以更改配置以包含 named permission-set(有关此问题的更多详细信息,请参阅该文章):

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

    不要忘记将此权限集与正确的&lt;CodeGroup&gt;(在您的情况下为Report_Expressions_Default_Permissions)和正确的配置文件相关联。

    这会影响您的整体安全吗?当然是的,那么您应该只授予所需的权限,并且只授予需要这些权限的报告。如果为您的 SSRS 报告正确配置了安全性,那么这应该不是问题。

    关于您的第二个版本,它不起作用,因为透明代码(在 SSRS 中执行的代码)对安全性是透明,它不能直接断言/更改安全性(另请参阅规则CA2140:透明代码不得引用安全关键项。)

    透明度是一种强制机制,它将作为应用程序的一部分运行的代码与作为基础架构的一部分运行的代码分开。透明度在可以执行特权操作的代码(关键代码)(例如调用本机代码)和不能执行特权的代码(透明代码)之间设置了一道屏障。透明代码可以在其操作的权限集范围内执行命令,但不能执行、派生自或包含关键代码。

    【讨论】:

    • 我恢复到我的第一个代码版本,并将权限集添加为 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\PrivateAssemblies\RSPreviewPolicy 中 NamedPermissionSets 元素中的最后一个。 config,但我仍然收到“SecurityPermission”错误。有什么想法吗?
    • 这仅适用于 报表设计器,但我猜您在开发过程中正在使用它。你还记得添加正确的 吗?
    • 不,我没有。我不确定代码组应该是什么样子。我想它应该包含“PermissionSetName=PermissionSetForIsInRole”,但我不知道我还应该配置什么。我是否需要在报告中配置任何内容,以使其使用此代码组?
    • 我应该在顶级代码组中添加代码组吗?我应该参考 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\PrivateAssemblies\Microsoft.ReportingServices.ProcessingCore.dll" 吗?我尝试了很多组合,但我仍然无法获得它工作......
    • 不,是关于 Report_Expressions_Default_Permissions:msdn.microsoft.com/en-us/library/ms154466.aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多