Поделиться через


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

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