Reporting Services 中的代码访问安全性
代码访问安全性以下面几个核心概念为中心:证据、代码组和命名权限集。 在 Reporting Services 中,报表管理器、报表设计器和报表服务器组件各有一个策略文件,用于为自定义程序集配置代码访问安全性。 此策略文件还配置数据、传递、呈现和安全扩展插件的代码访问。 下面几节提供了代码访问安全性的概述。 有关本节中介绍的文章的更多详细信息,请参阅 Microsoft .NET Framework SDK 文档中的“安全策略模型”。
Reporting Services 使用代码访问安全性,因为尽管报表服务器是基于 ASP.NET 技术构建的,但典型的 ASP.NET 应用程序和报表服务器之间有很大的差异。 典型的 ASP.NET 应用程序不执行用户代码。 相比之下,Reporting Services 使用开放式可扩展体系结构,该体系结构允许用户使用报表定义语言的 Code 元素来针对报表定义文件编程,并在自定义程序集内进行专用功能开发,以供报表使用。 此外,开发人员可以设计和部署功能强大的扩展插件来增强报表服务器的功能。 这种能力和灵活性需要尽可能多地提供保护和安全性。
Reporting Services 开发人员可以使用其报表中的任何 .NET Framework 程序集并在本机调用部署到全局程序集缓存中的所有程序集功能。 报表服务器唯一能够控制的内容就是向报表表达式和已加载的自定义程序集授予的权限。 在 Reporting Services 中,自定义程序集在默认情况下接收仅 Execute 权限。
证据
证据是公共语言运行时 (CLR) 用来为代码程序集确定安全策略的信息。 证据向公共语言运行时指示代码具有特定的特征。 证据的常见形式包括数字签名和程序集位置, 但也可以自定义设计证据来表示其他对应用程序有意义的信息。
程序集和应用程序域都接收基于证据的权限。 例如,Reporting Services 尝试访问的程序集的位置是一种常见形式的弱名称程序集证据。 此示例称为 URL 证据。 部署到报表服务器的自定义数据处理扩展插件的 URL 证据可能是 C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\bin\Microsoft.Samples.ReportingServices.FsiDataExtension.dll
。 程序集的强名称或数字签名是另一种常见形式的证据。 在这种情况下,证据是程序集的公钥信息。
代码组
代码组是代码的逻辑分组,该分组具有指定的成员身份条件。 所有满足成员身份条件的代码均包括在该组中。 管理员通过管理代码组及其关联权限集来配置安全策略。
代码组的成员身份条件基于证据。 例如,代码组的 URL 成员身份基于 URL 证据。 公共语言运行时 (CLR) 使用标识特征(如 URL 证据)来描述代码并确定是否已符合组的成员身份条件。 例如,如果代码组的成员身份条件是“程序集 C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\bin\Microsoft.Samples.ReportingServices.FsiDataExtension.dll 中的代码”,则公共语言运行时会检查证据以确定代码是否源自该位置。 此类型的代码组的配置条目示例可能如以下示例所示:
<CodeGroup class="UnionCodeGroup"
version="1"
PermissionSetName="FullTrust"
Name="MyCodeGroup"
Description="Code group for my data processing extension">
<IMembershipCondition class="UrlMembershipCondition"
version="1"
Url="C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\bin\Microsoft.Samples.ReportingServices.FsiDataExtension.dll"
/>
</CodeGroup>
应当与系统管理员或应用程序开发专家一起来确定代码访问安全性的类型以及自定义程序集或 Reporting Services 扩展插件所需的代码组。
命名权限集
命名权限集是管理员可以将其与某个代码组关联的权限集。 大多数命名权限集都至少包含一个权限、一个名称以及对该权限集的说明。 管理员可以使用命名权限集来创建或修改代码组的安全策略。 可以将多个代码组与同一个命名权限集关联。 CLR 提供内置的命名权限集,如 Nothing、 Execution、 Internet、 LocalIntranet、 Everything 和 FullTrust。
注意
Reporting Services 中的自定义数据扩展插件、传递扩展插件、呈现扩展插件和安全扩展插件必须以 FullTrust 权限集运行。 可以与系统管理员一起为 Reporting Services 扩展插件添加适当的代码组和成员身份条件。
可以将自定义的权限级别与那些和报表一起使用的自定义程序集相关联。 例如,如果您希望允许程序集访问特定的文件,则可以新建一个具有特定文件 I/O 访问权限的命名权限集,然后将该权限集分配给您的代码组。 下面的权限集向 MyFile.xml 文件授予只读访问权限:
<PermissionSet class="NamedPermissionSet"
version="1"
Name="MyNewFilePermissionSet"
Description="A special permission set that grants read access to my file.">
<IPermission class="FileIOPermission"
version="1"
Read="C:\MyFile.xml"/>
<IPermission class="SecurityPermission"
version="1"
Flags="Assertion, Execution"/>
</PermissionSet>
授予此权限集的代码组可能如以下示例所示:
<CodeGroup class="UnionCodeGroup"
version="1"
PermissionSetName="MyNewFilePermissionSet"
Name="MyNewCodeGroup"
Description="A special code group for my custom assembly.">
<IMembershipCondition class="UrlMembershipCondition"
version="1"
Url="C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\bin\MyCustomAssembly.dll"/>
</CodeGroup>