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

Как работает запрос на разрешение. Стратегия запроса разрешений. Запрет разрешений.

Чтобы проверить, имеет ли код разрешение на доступ к ресурсу или на выполнение операции, общеязыковая среда выполнения CLR проверяет все вызывающие программы из стекового фрейма с целью убедиться, предоставлено ли запрошенное разрешение каждой сборке, имеющей метод в стеке. И если у какой-либо вызывающей программы из стека нет требуемого разрешения, то запускается исключение SecurityException.

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

Из следующих разделов вы узнаете, что с помощью методов Deny (Запретить) или Assert (Утвердить) базового класса CodeAccessPermission можно изменить результаты, полученные при просмотре стека.

Стратегия запроса разрешений

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

Не следует запрашивать ненужные разрешения, и тогда будет сведена к минимуму вероятность, что код разрушит что-либо из-за ошибок или злого умысла в компонентах сторонних производителей. На самом же деле, чтобы предотвратить такой ущерб, вы можете ограничить имеющиеся у вас разрешения до необходимого минимума. Если, например, не нужно, чтобы программа выполняла на диске операции чтения и записи в файлах, то выполнение таких операций нужно запретить.

Запрет разрешений

К разрешению можно применять метод Deny (Запретить). Тогда, даже если политика безопасности и разрешает доступ к файлу, любая попытка такого доступа будет безуспешной. Это демонстрируется примером SimplePermissionCodeDenial. Вместо того, чтобы требовать разрешение, мы вызываем метод Deny (Запретить) объекта FilelOPermission.

try {
fileIOPerm › Deny(); Console::WriteLine(
"File Access Permission Removed"); // "Запретить доступ к файлу"
}
catch(SecurityException *se)
{
Console::WriteLine(se › Message); // Сообщение
}

Затем мы попытаемся прочитать файл с помощью метода ReadFile. Вскоре мы объясним, зачем это делается внутри другого метода. Поскольку в этом разрешении было отказано, то конструктор Filelnfо запустит исключение SecurityException.

try
{
Filelnfo *f.le = new Filelnfo (filename); // имя файла
StreamReade: *sr = file › OpenText();
String *tex;; // Строка
text = sr-XeadLine();
while (text!= 0)
{
Console.:WriteLine (" {0}", text); text =;r › ReadLine ();
}
sr › Close ():
}
catch (SecurityE<ception *se)
{
Console:: WrLteLine(
"Could iot read file: {0}",se › Message); // Сообщение
// "He:мог прочитать файл: {0} "
}

Потом, чтобы аннулировать отказ в доступе, мы вызываем статический метод RevertDeny класс FilelOPermission, и снова пытаемся прочитать файл. На этот раз файл читать можно Данный вызов Deny (Запретить) действует до тех пор, пока содержащий его код не возвратит управление вызвавшей программе, или до следующего вызова метода Deny (Запретить). RevertDeny удаляет все текущие запросы Deny (Запретить).

FilelOPermissicn::RevertDeny();
ReadFile();

Затем мы вызывем метод Deny (Запретить), чтобы еще раз удалить разрешение.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.