Утверждение разрешений в пользовательских сборках

По умолчанию код пользовательской сборки выполняется с ограниченным набором разрешений 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».