了解安全策略
报表服务器执行的任何代码都必须是特定代码访问安全策略的一部分。 这些安全策略包含多个将证据映射到一组命名权限集的代码组。 通常,代码组与在该组中为代码指定可允许权限的命名权限集关联。 运行时使用受信任主机或加载程序所提供的证据来确定代码所属的代码组,从而确定要授予代码的权限。 Reporting Services 遵循由 Microsoft .NET Framework 公共语言运行时 (CLR) 定义的安全策略体系结构。 下面几节介绍了 Reporting Services 中的各种代码类型以及与它们相关联的策略规则。
报表服务器程序集
报表服务器程序集包含属于 Reporting Services 产品的一部分的代码。 Reporting Services 是用托管代码程序集编写的;所有这些程序集都采用了强命名模式(即数字签名模式)。 这些程序集的代码组是使用 StrongNameMembershipCondition 定义的,StrongNameMembershipCondition 为程序集的强名称提供基于公钥信息的证据。 代码组被授予 FullTrust 权限集。
报表服务器扩展插件(呈现、数据、传递和安全性)
报表服务器扩展插件是你或第三方为了扩展 Reporting Services 的功能而创建的自定义数据扩展插件、传递扩展插件、呈现扩展插件和安全扩展插件。 必须将 FullTrust 授予与要扩展的 Reporting Services 组件关联的策略配置文件中的这些扩展或程序集代码。 随 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>
Execution 权限集允许运行(执行)代码,但是不使用受保护的资源。 在报表中找到的所有表达式都编译为一个称作“表达式宿主”的程序集,该程序集作为已编译报表的一部分存储。 在执行报表时,报表服务器会加载并调用表达式宿主程序集以执行相应的表达式。 对表达式宿主程序集进行签名所用的密钥与为所有的表达式宿主定义代码组所用的密钥相同。
报表表达式引用报表对象模型集合(字段、参数等)并执行简单任务(如算术和字符串运算)。 用来执行这些简单操作的代码只需要 Execution 权限。 在 Reporting Services 中,Code 元素中的用户定义方法以及任何自定义程序集在默认情况下都被授予 Execution 权限。 因此,对于大多数表达式,当前配置不需要修改任何安全策略文件。 若要向表达式宿主程序集授予额外的权限,管理员需要修改报表服务器的策略配置文件和报表设计器,并更改报表表达式代码组。 因为它是全局设置,因此更改表达式主机的默认权限会影响所有报表。 因此,应将所有需要额外安全性的代码放入自定义程序集中。 仅向此程序集授予所需的权限。
重要
用来调用外部程序集或受保护资源的代码应当合并到一个自定义程序集内以供报表使用, 这会使您对代码所请求和断言的权限进行更多的控制。 不应当为了保护 Code 元素中的方法而进行调用。 因为这样做会要求你向报表表达式宿主授予 FullTrust,并向所有的自定义代码授予对 CLR 的完全访问权限。
注意
请不要向报表表达式宿主的代码组授予 FullTrust。 否则将允许所有的报表表达式发出受保护的系统调用。
报表中引用的自定义程序集
某些报表表达式可以调用其他代码程序集,在 Reporting Services 中也称为自定义程序集。 报表服务器要求策略配置文件中的这些程序集至少具有 Execution 权限。 默认情况下,Reporting Services 随附的策略文件会从“我的电脑”区域开始,向所有的程序集授予 Execution 权限。 可以根据需要向自定义程序集授予额外的权限。
在某些情况下,可能需要执行需要报表表达式中特定代码权限的操作。 通常,此方案意味着报表表达式需要调用受保护的 CLR 库方法(例如访问文件或系统注册表)。 .NET Framework 文档介绍了进行此安全调用所需的代码权限。 若要执行调用,必须向调用代码授予这些特定的安全权限。 如果从报表表达式或 Code 元素发出调用,则必须向表达式宿主程序集授予相应的权限。 但是,在向表达式宿主授予相应的权限之后,在任何报表中的任何表达式中运行的所有代码现在都将被授予此特定权限。 从自定义程序集调用并向该自定义程序集授予特定权限更为安全。