Иллюстрированный самоучитель по Architecture .NET

Неуправляемый код. Разрешения на основе атрибутов.

Утверждения необходимы для того, чтобы управлять доступом к неуправляемому коду. Дело в том, что этот код не должен прямо вызываться управляемым кодом. Чтобы вызывать неуправляемый код, требуется соответствующее разрешение. Поскольку общеязыковая среда выполнения CLR просматривает стек, чтобы проверить, имеют ли все вызывающие программы разрешение на вызов неуправляемого кода, то разрешение на вызов неуправляемого кода надо предоставить всему коду. Следовательно, сборки, не относящиеся к тем, которым вы доверяете, могли бы выполнять операции с помощью вызовов интерфейса 32-разрядных Windows-приложений (API Win32) и подрывать систему безопасности .NET.

Лучше делать вызовы через интерфейсные классы сборки, которая имеет право на управляемый код. Код интерфейсного класса должен сначала выяснить, есть ли у вызывающей программы соответствующие права от общеязыковой среды выполнения CLR, и поэтому требует, чтобы вызывающая программа имела минимальный набор разрешений, необходимых для выполнения задачи (такой, например, как запись в файл). Если требование прав удовлетворено, то интерфейсный код может утвердить право на управляемый код. Тогда никакой другой сборке из цепочки вызовов право на управляемый код не требуется.

Например, когда вы просите файловые .NET-классы удалить какой-либо файл, то вначале они требуют разрешение на удаление этого файла. Если разрешение получено, то код утверждает право на вызов управляемого кода и вызывает для выполнения удаления интерфейс 32-разрядных Windows-приложений (API Win32).

Разрешения на основе атрибутов

Пример SimplePermissionAttributeRequest показывает, как использовать атрибуты для выдачи запросов на те или иные разрешения. В этом примере атрибут нужен для того, чтобы передать метаданные в сборку, для запуска которой требуется разрешение Centres JLPrincipal. Таким образом можно заранее узнать, какие компоненты конфликтуют с политикой безопасности.

[assembly: Securitу Permission (
SecurityAction::RequestMinimum,
ControlPrinc:ipal=true) ];
public _gc class PermAttrib
// класс сборицхнгка мусора PermAttrib
{
public:
static int Imain()
{

В перечислении SecurityAction имеется несколько значений, часть из которых можно применять к классу или методу, а часть, как в этом примере, – к сборке. К сборкам применяются RequestMinimum, RequestOptional и RequestRefuse. RequestMinimum указывает на те метаданные, чьи разрешения необходимы для запуска сборки. RequestOjptional указывает на те разрешения метаданных, которые сборке неплохо бы иметь, но без которых, впрочем, она все-таки может выполняться. RequestRefuse указывает на те разрешения, от которых сборка хотела бы отказаться15.

Если в примере SimplePermissionAttributeRequest значение атрибута поменять на RequestRefuse, а затем этот пример запустить, то хотя сборка и будет загружена, попытка изменить политику приведет к запуску исключения SecurityException.

Остальные значения применяются к классам и методам. Значение LinkDemand нужно тогда, когда делается ссылка на некоторый тип. При этом требуется, чтобы непосредственно вызвавшая программа имела разрешение. Другие значения применяются во время выполнения. InheritanceDemand требует, чтобы разрешение имелось у производного класса. Assert (Утвердить), Deny (Запретить), PermitOnly и Demand (Требование) требуют именно то, что от них можно ожидать.

Вот пример требования FilelOPermission, применяемого к классу с помощью атрибута. Для файла требуется AllAccess. Надо обязательно указывать полный путь к файлу.

[FilelOPermission(
SecurityAction::Demand,
All = "c:\\foo\\read.txt")]
public class Simple
// общедоступный Простой класс
{
};
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.