Опубликован: 11.09.2006 | Доступ: свободный | Студентов: 7646 / 472 | Оценка: 4.26 / 3.45 | Длительность: 30:46:00
ISBN: 978-5-9556-0080-2
Лекция 10:

Безопасность Windows-форм

Уровни безопасности

Существует несколько уровней безопасности: сеть, компьютер, пользователь, домен приложения (дополнительный уровень). В таблице 10.2 дано описание каждого уровня.

Таблица 10.2. Уровни безопасности
Уровень безопасности Описание
Сеть (Enterprise level) Уровень контролируется администратором сети и содержит группы кода, которые могут быть назначены любому управляемому коду во всей корпоративной сети
Компьютер (Machine) Уровень контролируется администратором компьютера и содержит группы кода, которые могут быть назначены любому управляемому коду, выполняемому на данном компьютере
Пользователь (User) Уровень контролируется пользователем компьютера и содержит группы кода, которые могут быть назначены любому управляемому коду, выполняемому от имени данного пользователя
Домен приложения (Application Domain) Дополнительный уровень, позволяющий изолировать, выгружать и ограничивать выполняемый управляемый код

Окончательный набор разрешений получается в результате суммы всех разрешений от каждой сборки, т.к. каждая сборка может иметь свой набор разрешений (рис. 10.4).

Принцип работы безопасности доступа кода

Рис. 10.4. Принцип работы безопасности доступа кода

Среда выполнения Common Language Runtime (CLR) также имеет стандартную политику безопасности и использует ее набор разрешений ( табл. 10.3).

Таблица 10.3. Набор разрешений CLR
Отсутствие разрешений (Nothing) Отсутствуют какие-либо разрешения. Код не может быть запущен. Код из "небезопасной" зоны использует эту политику безопасности.
Извлечение (Execution) Предоставляет разрешение только на запуск приложения. Не разрешает приложению использовать какие-либо ресурсы
Интернет (Internet) Предоставляет разрешения на выполнение кода, открытие диалоговых окон, создание web-соединений с сайтом, с которого установлено приложение, и использование изолированного хранилища с ограниченным размером. По умолчанию, весь код из Интернета и "небезопасные" зоны используют эту политику безопасности
Корпоративная интрасеть (Local Intranet) Предоставляет разрешения на запуск кода; его выполнение без ограничений; использование изолированного хранилища без лимита; использование DNS-служб; использование таких данных, как имя пользователя и временных переменных; создание web-соединения с сайтами, с которых взяты сборки, используемые в приложении; чтение и сохранение файлов из того же каталога, что и приложение. По умолчанию, весь код из сети использует эту политику безопасности
Весь доступ (Everything) Предоставляет все стандартные разрешения, кроме отмены верификации
Полный доступ (Full Trust) Предоставляет полный доступ ко всем ресурсам. По умолчанию, весь управляемый код локального компьютера использует эту политику безопасности

Использование безопасности доступа кода

Каждое приложение, которое использует CLR, должно взаимодействовать с системой безопасности во время выполнения. Когда приложение выполняется, CLR автоматически проверяет все сборки приложения и возвращает набор разрешений. В зависимости от набора разрешений или ресурсов, с которыми работает приложение, оно либо выполняет заданные действия, либо генерирует исключение безопасности.

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

Взаимодействие с системой безопасности во время выполнения осуществляется двумя способами: императивным и декларативным. Декларативный способ взаимодействия осуществляется с помощью атрибутов, императивный – с помощью объектов классов в вашем приложении. Некоторые операции могут быть выполнены с помощью одного из способов, а некоторые — любым из них.

Из-за того, что большинство разрешений уже встроены в .NET Framework, практически не приходится создавать собственные разрешения. Выполняемый код, взаимодействующий с определенными ресурсами, проходит проверку и получает разрешения на использование данных ресурсов. Итак, основной задачей на стадии разработки остается лишь документирование необходимых приложению разрешений для того, чтобы быть уверенным, что приложение их получит. Это делается с помощью запроса разрешений и утилит настройки политики безопасности.

Для того чтобы добавить запрос на определенное разрешение, необходимо добавить соответствующий атрибут в файл ApplicationInfo.cs проекта. При компиляции сборки эти атрибуты сохранятся в метаданных. Запросы на разрешения проверяются CLR во время загрузки сборки. Существует три вида запросов, описание которых приводится в таблице 10.4.

Таблица 10.4.
Запрос Описание запроса
Запрос минимального набора разрешений (RequestMinimum) Запрашивает необходимый минимум для корректной работы приложения. Если это разрешение не назначено политикой безопасности, то CLR не выполнит операции, а сгенерирует исключение типа PolicyException. Этим запросом необходимо пользоваться только для минимальных разрешений
Запрос дополнительного набора разрешений (RequestOptional) Представляет набор разрешений, с которыми может работать ваше приложение, но без которых оно сможет корректно выполнять действия. Этим запросом описывают дополнительную функциональность приложения. Если это разрешение не назначено политикой безопасности, то приложение будет продолжать работать
Запрос на отказ от разрешений (RequestRefused) Указываются разрешения, которые ваше приложение использовать не будет. Запросы указываются для обеспечения дополнительной безопасности

В "Работа с элементами управления" мы работали с проектом BinaryReadWrite. Скопируйте всю папку проекта и переименуйте ее в Permissions. Снова поместите в папку bin\Debug какой-нибудь файл формата MP3 и назовите его music.mp3. Запустите проект и убедитесь в том, что в этой же папке появился записанный файл newmusic.mp3. Теперь добавляем пространство имен System.Security и соответствующий блок исключений:

using System;
using System.IO;
using System.Security;
namespace BinaryReadWrite
{

        class Class1
        {

                [STAThread]
                static void Main(string[] args)
                {
                        //Добавляем блок обработки исключений
                        try
                        {
                                //Создаем новый поток Chtenie  и указываем  файл для чтения — music.mp3
                                FileStream Chtenie = new FileStream("music.mp3", FileMode.Open);

                                //Создаем экземпляр  br класса BinaryReader и связываем  его с потоком Chtenie
                                BinaryReader br = new BinaryReader(Chtenie);

                                // Создаем массив типа байтов и
                                //передаем ему размер в байтах — (например, 1000000 ) записываемого файла
                                byte[] n = br.ReadBytes(1000000);
                                //Закрываем поток
                                br.Close();
                                //Создаем новый поток Zapis  и указываем  название файла для записи sozdanajamuzika.mp3
                                FileStream Zapis = new FileStream("newmusic.mp3", FileMode.CreateNew, FileAccess.Write);
                                //Создаем экземпляр  wr класса BinaryWriter и связываем  его с потоком Zapis
                                BinaryWriter wr = new BinaryWriter(Zapis);
                                // Можно связывать объект wr с потоком, создавая его без названия:
                                //BinaryWriter wr = new BinaryWriter(new FileStream("sozdanajamuzika.mp3", FileMode.CreateNew, FileAccess.Write));
                                //Передаем в поток массив байтов n
                                wr.Write(n);
                                //Закрываем поток
                                br.Close();
                        }
                        catch (SecurityException ex)
                        {
                                Console.WriteLine(ex.Message);
                        }

                }
        }
}
Листинг 10.1.

В окне Solution Explorer дважды щелкаем на файл AssemblyInfo.cs и для использования атрибутов добавляем пространство имен System.Security.Permissions:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Permissions;

В конце листинга AssemblyInfo.cs определяем минимальный набор разрешений:

// Запрос минимального набора разрешений
[assembly: UIPermission(SecurityAction.RequestOptional, Window = 
UIPermissionWindow.SafeTopLevelWindows)]
[assembly: PermissionSet(SecurityAction.RequestOptional, Name = "LocalIntranet")]

Это разрешение не было назначено политикой безопасности, поэтому генерируется исключение (рис. 10.5).

Сгенерированное исключение при определении минимального набора разрешений

увеличить изображение
Рис. 10.5. Сгенерированное исключение при определении минимального набора разрешений

Для получения доступа следует определять другие наборы разрешений и настраивать политику безопасности. Например, данный запрос разрешений указывает, что сборка не нуждается в дополнительных разрешениях:

[assembly:PermissionSet(SecurityAction.RequestOptional, Unrestricted = false)]

На диске, прилагаемом к книге, вы найдете приложение Permissions (Code\Glava10\ Permissions).

Елена Дьяконова
Елена Дьяконова

При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: 

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан.

Затем:

Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll

Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.

Александр Сороколет
Александр Сороколет

Свойство WindowState формы blank Maximized. Не открывается почемуто на всё окно, а вот если последующую форму бланк открыть уже на макс открывается :-/