на начало
На главную страницу
Форум   

Статья :: Простой запрос разрешения кодом


Простой запрос разрешения кодом

В примере SimplePermissionCodeRequest вначале запрашивается разрешение на доступ к файлу. Если в ответ на этот запрос общеязыковая среда выполнения CLR разрешения не дает, то внутри конструктора файлов она запускает исключение SecurityException. Впрочем, сперва код сам проверяет, есть ли у него это разрешение. Если разрешения у кода нет, то он и не пытается получить доступ к файлу, а просто возвращает управление вызвавшей его программе.
Обычно такое действие является излишним, потому что общеязыковая среда выполнения CLR будет предъявлять свое требование внутри конструктора, но часто вам бывает нужно проверить разрешения перед выполнением некоторого кода, чтобы выяснить, имеете ли вы необходимые права.
Класс FilelOPermission моделирует разрешения (на доступ к файлам) общеязыковой среды выполнения CLR. Его конструктору должен быть предоставлен полный путь, и для получения полного пути мы используем класс Path (Путь), о котором говорилось в главе 8 "Классы каркаса NET Framework". Мы просим доступ к файлу на чтение, запись и добавление в конец (append). Другими возможными правами доступа являются NoAccess или PathDiscovery. Последнее требуется для доступа к информации о самом пути к файлу. Вы, возможно, хотите разрешить доступ к файлу, но при этом скрыть определенную информацию, такую, например, как структура каталогов или имена пользователей в пути.
В результате выдачи запроса проверяется, есть ли у вас требуемое разрешение. Метод Demand (Требование) проверяет, имеют ли это разрешение все вызывающие программы в стеке. Другими словами, нам надо убедиться, что это право имеется не только у сборки с выполняющимся кодом, но также у всех сборок, вызвавших этот код. Если исключение генерируется, то затребованного права нет, и нам придется завершить выполнение программы.

static int Main() {
String *filename = ".\\read.txt"; // Строка
String *fileWithFullPath = // Строка
Path::GetFullPath(filename); // имя файла
try
{
FilelOPermission *fileIOPerm =
new FilelOPermission(
FilelOPermissionAccess::AllAccess, fileWithFullPath); fileIOPerm->Demand(); // Запрос }
catch(Exception *e) // Исключение {
Console::WriteLine(e->Message); // Сообщение return 1; } try
{
Filelnfo *file = new Filelnfo(filename); // имя файла
StreamReader *sr = file->OpenText(); // файл
String *text; // Строка
text = sr->ReadLine();
while (text != 0)
// пока (текст! = 0)
{
Console::WriteLine(text); // текст text = sr->ReadLine(); // текст
}
sr->Close(); }
catch(Exception *e) // Исключение {
Console::WriteLine(e->Message); // Сообщение }
return 0; }

Даже если у кода есть разрешение на чтение, полученное от общеязыковой среды выполнения CLR, у пользователя все равно должно быть разрешение на чтение от файловой системы. Если у пользователя такого разрешения нет, то при вызове метода OpenText будет запущено исключение UnauthorizedAccessException (Исключение Unau-IhorizedAccess, т.е. Исключение несанкционированного доступа).
Будьте внимательны, когда нужно передать коду в других сборках объекты, прошедшие проверку на безопасность в своих конструкторах. Поскольку проверка выполнена в конструкторе, то общеязыковая среда выполнения CLR уже не делает никаких проверок прав доступа. Сборка, которой вы передаете объект, может не иметь таких же прав, как ваша. И если бы объект Filelnfo был передан другой сборке, не получившей от общеязыковой среды выполнения CLR права на чтение, то ему общеязыковая среда выполнения CLR все равно не помешала бы получить доступ к файлу. Дело в том, что в таком случае не было бы никакой дополнительной проверки на безопасность. Конечно, разработчики пошли на этот компромисс ради производительности, — чтобы избежать проверки на безопасность при каждой операции. То же самое справедливо и для других разрешений коду на доступ.


Простой запрос разрешения кодом

страницы в данном разделе 
Глава 13. Защита Защита
Защита на основе пользователей Защита доступа к коду
Политика безопасности Разрешения
lnternet-безопасность Информационный сервер Internet: Internet Information Server (MS)
Защита .NET на основе ролей Принципалы и личности
Роли .NET в Windows Другие классы личностей
Личность в операционной системе и общеязыковой среде выполнения CLR Разрешения коду на доступ
Простой запрос разрешения кодом Как работает запрос на разрешение
Стратегия запроса разрешений Запрет разрешений
Утверждение разрешений Другие методы разрешений
Класс SecurityPermission Неуправляемый код
Разрешения на основе атрибутов Разрешение принципала
Класс PermissionSet Личность кода
Классы разрешений для личности Подтверждение
Политика безопасности Уровни политики безопасности
Кодовые группы Именованные наборы разрешений
Изменение политики безопасности Резюме


Содержание сайта (выборка)
Apache
Протоколы TCP/IP (принципы, протоколы и архитектура)



PHP, PELR, JSP
PHP
JavaServer Pages (JSP)

Базы данных
Основы mysql
СУБД INFORMIX
СУБД POSTGRES
Основы проектирования реляционных баз данных

HTML, javascript
Спецификация HTML 4.01
Каскадные Таблицы Стилей, Уровень 2
Клиентский JavaScript. Справочник.
JavaScript руководство пользователя
Серверный JavaScript 1.4. Руководство по Использованию.

Паскаль, C, C++, C#
GCC (примеры)
FAQ Валентинa Озеровa DELPHI
C



 
© faq.pp.ru, справочник программиста