在自定义程序集中断言权限

默认情况下,自定义程序集代码以受限的 Execution 权限集运行。 在某些情况下,你可能希望实现一个自定义程序集,该程序集对安全系统中受保护的资源(如文件或注册表)进行安全调用。 若要完成此操作,必须执行以下操作:

  1. 标识代码为进行安全调用所需的确切权限。 如果此方法是 Microsoft .NET Framework 库的一部分,则此信息应包括在方法文档中。

  2. 修改报表服务器策略配置文件,以便向自定义程序集授予所需的权限。 有关安全策略配置文件的详细信息,请参阅使用 Reporting Services 安全策略文件

  3. 将所需权限断言为按其进行安全调用的方法的一部分。 这是必需的,因为报表服务器调用的自定义程序集代码属于报表表达式宿主程序集,默认以 Execution 权限运行。 Execution 权限集允许代码运行,但无法使用受保护的资源

  4. 使用 AllowPartiallyTrustedCallersAttribute 标记自定义程序集(如果使用强名称进行签名)。 这是必需的,因为自定义程序集是从报表表达式宿主程序集的一部分调用的,默认情况下不会授予 FullTrust;因此它是“部分受信任的”调用方。 有关详细信息,请参阅使用具有强名称的自定义程序集

实现安全呼叫

您可以修改策略配置文件,以便向您的程序集授予特定的权限。 例如,如果您正在编写用于处理货币换算的自定义程序集,则可能需要从某一文件读取当前外币汇率。 若要检索速率信息,需要向程序集的权限集添加额外的安全权限 FileIOPermission。 您可以在策略配置文件中输入以下附加内容:

<PermissionSet class="NamedPermissionSet"  
   version="1"  
   Name="CurrencyRatesFilePermissionSet"  
   Description="A special permission set that grants read access to my currency rates file.">  
      <IPermission class="FileIOPermission"  
         version="1"  
         Read="C:\CurrencyRates.xml"/>  
      <IPermission class="SecurityPermission"  
         version="1"  
         Flags="Execution, Assertion"/>  
</PermissionSet>  

然后,添加引用该权限集的代码组:

<CodeGroup class="UnionCodeGroup"  
   version="1"  
   PermissionSetName="CurrencyRatesFilePermissionSet"  
   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\MSSQL\Reporting Services\ReportServer\bin\CurrencyConversion.dll"/>  
</CodeGroup>  

为使您的代码可以获取相应权限,必须在自定义程序集代码内断言该权限。 例如,如果您想要添加对某一 XML 文件 C:\CurrencyRates.xml 的只读访问,则必须向您的方法添加以下代码:

// C#  
FileIOPermission permission = new FileIOPermission(FileIOPermissionAccess.Read, @"C:\CurrencyRates.xml");  
try  
{  
   permission.Assert();  
   // Load the XML currency rates file  
   XmlDocument doc = new XmlDocument();  
   doc.Load(@"C:\CurrencyRates.xml");  
...  

还可以将断言作为方法属性添加:

[FileIOPermissionAttribute(SecurityAction.Assert, Read=@"C:\CurrencyRates.xml")]  

有关详细信息,请参阅 .NET Framework 开发人员指南中的“.NET Framework 安全性”。