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

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