カスタムアセンブリにおける権限の主張

デフォルトでは、カスタムアセンブリコードは Execution 権限が制限された状態で動作します。 場合によっては、セキュリティシステム内の保護されたリソース(ファイルやレジストリなど)にセキュアコールを行うカスタムアセンブリを実装したい場合もあります。 これを達成するために、以下の行動を取らなければなりません:

  1. コードがセキュアな通話を行うために必要な正確な権限を特定しましょう。 このメソッドがMicrosoft .NETフレームワークライブラリの一部であれば、この情報はメソッドのドキュメントに含めるべきです。

  2. レポートサーバーのポリシー設定ファイルを修正し、カスタムアセンブリに必要な権限を付与します。 セキュリティポリシー設定ファイルの詳細については、「Using Reporting Services Security Policy Files」をご覧ください。

  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 Developer's Guideの「.NET Framework Security」をご覧ください。