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

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

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

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

  3. 在进行安全调用的方法中断言所需权限。 这是必需的,因为报表服务器调用的自定义程序集代码是报表表达式主机程序集的一部分,该程序集默认使用 执行 权限运行。 执行权限集允许代码运行,但不允许使用受保护的资源。

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

实现安全呼叫

可以修改策略配置文件,以授予程序集特定的权限。 例如,如果要编写自定义程序集来处理货币转换,则可能需要从文件中读取当前货币汇率。 若要检索速率信息,需要向程序集的权限集添加额外的安全权限 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 安全性”。

另请参阅

将自定义程序集用于报表