了解安全策略

报表服务器执行的任何代码都必须是特定代码访问安全策略的一部分。 这些安全策略由将证据映射到一组命名权限集的代码组组成。 通常,代码组与指定该组中代码的允许权限的命名权限集相关联。 运行时使用受信任的主机或加载程序提供的证据来确定代码所属的代码组,因此,要授予代码的权限。 Reporting Services 遵循Microsoft .NET Framework 公共语言运行时(CLR)定义的此安全策略体系结构。 以下部分介绍 Reporting Services 中的各种类型的代码及其关联的策略规则。

报表服务器程序集

报表服务器程序集是包含 Reporting Services 产品一部分的代码的程序集。 Reporting Services 是使用托管代码程序集编写的;所有这些程序集都具有强名称(即数字签名)。 这些程序集的代码组是使用 StrongNameMembershipCondition 定义的,后者根据程序集的强名称的公钥信息提供证据。 代码组被授予 FullTrust 权限集。

报表服务器扩展插件(呈现、数据、传递和安全性)

报表服务器扩展插件是你或其他第三方创建的自定义数据、传递、呈现和安全扩展插件,用于扩展 Reporting Services 的功能。 必须在与要扩展的 Reporting Services 组件关联的策略配置文件中向 FullTrust 授予 FullTrust 这些扩展或程序集代码。 作为 Reporting Services 的一部分提供的扩展使用报表服务器公钥进行签名,并接收 FullTrust 权限集。

重要

必须修改 Reporting Services 策略配置文件,以允许任何第三方扩展的 FullTrust 。 如果不为自定义扩展添加具有 FullTrust 的代码组,则报表服务器无法使用它们。

有关 Reporting Services 中的策略配置文件的详细信息,请参阅 使用 Reporting Services 安全策略文件

报表中使用的表达式

报表表达式是包含在报表定义语言文件的 Code 元素中的内联代码表达式或用户定义的方法。 策略文件中已配置了一个代码组,这些代码组默认授予 执行 权限集。 代码组如下所示:

<CodeGroup  
   class="UnionCodeGroup"  
   version="1"  
   PermissionSetName="Execution"  
   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="002400..."  
    />  
</CodeGroup>  

执行 权限允许代码运行(执行),但不允许使用受保护的资源。 在报表中找到的所有表达式都编译为程序集(称为“表达式宿主”程序集),该程序集作为已编译报表的一部分存储。 执行报表时,报表服务器将加载表达式主机程序集,并调用该程序集以执行表达式。 表达式主机程序集使用用于定义所有表达式主机的代码组的特定密钥进行签名。

报表表达式引用报表对象模型集合(字段、参数等),并执行简单的任务,例如算术和字符串运算。 执行这些简单作的代码只需要 执行 权限。 默认情况下, Code 元素和任何自定义程序集中的用户定义的方法在 Reporting Services 中被授予 执行 权限。 因此,对于大多数表达式,当前配置不需要修改任何安全策略文件。 若要向表达式宿主程序集授予其他权限,管理员需要修改报表服务器和报表设计器的策略配置文件,并更改报表表达式代码组。 因为它是全局设置,因此更改表达式主机的默认权限会影响所有报表。 因此,强烈建议将所有需要额外安全性的代码放入自定义程序集。 仅向此程序集授予所需的权限。

重要

调用外部程序集或受保护资源的代码应合并到自定义程序集中,以便在报表中使用。 这样做可以更好地控制代码请求和断言的权限。 不应调用 Code 元素中的安全方法。 这样做需要向报表表达式主机授予 FullTrust ,并授予对 CLR 的所有自定义代码完全访问权限。

谨慎

不要向报表表达式主机的代码组授予 FullTrust 。 如果这样做,请启用所有报表表达式进行受保护的系统调用。

报表中引用的自定义程序集

某些报表表达式可以调用第三方代码程序集,在 Reporting Services 中也称为自定义程序集。 报表服务器要求这些程序集在策略配置文件中至少具有 执行 权限。 默认情况下,随 Reporting Services 附带的策略文件授予从“我的计算机”区域开始的所有程序集 的执行 权限。 可以根据需要向自定义程序集授予其他权限。

在某些情况下,可能需要执行需要报表表达式中特定代码权限的作。 通常,这意味着报表表达式需要调用受保护的 CLR 库方法(例如访问文件或系统注册表)。 .NET Framework 文档描述了进行此安全调用所需的代码权限;若要执行调用,必须向调用代码授予这些特定的安全权限。 如果从报表表达式或 Code 元素进行调用,则必须向表达式宿主程序集授予相应的权限。 但是,授予表达式承载权限后,任何报表中的任何表达式中运行的所有代码现在都被授予该特定权限。 从自定义程序集调用并向该自定义程序集授予特定权限更为安全。

另请参阅

Reporting Services 中的代码访问安全性
安全开发(Reporting Services)