C# для профессионалов. Том II
Шрифт:
При желании перехватывать исключения, порождаемые CLR, когда код пытается действовать вопреки предоставленным ему правам, можно перехватывать исключение типа
Запрашиваемые полномочия
Как мы видели выше, требуемые полномочия вполне четко определяют, что необходимо во время выполнения, однако можно сконфигурировать сборку так, чтобы она делала более мягкий запрос прав прямо в начале выполнения, где она объявляет, что ей нужно: Можно запросить полномочия тремя способами:
□ Минимальные полномочия (Mimimum) — полномочия, которые требуются коду для выполнения.
□ Необязательные полномочия (Optional) — полномочия, которые код может использовать, но способен эффективно выполняться и без них.
□ Непригодные полномочия (Refused) — полномочия, которые не должны предоставляться коду.
Почему необходимо запрашивать полномочия при запуске сборки? Существует несколько причин:
□ Если сборке требуются некоторые полномочия для выполнения, то имеет смысл сообщить об этом в начале, а не во время выполнения.
□ Будут предоставлены только запрашиваемые полномочия и никакие другие. Это сокращает риск воздействия сборки на области, для которых у нее нет прав.
□ Если запрашивается минимальный набор полномочий, увеличивается вероятность того, что сборка будет выполнена.
Запрос полномочий скорее всего будет тем нужнее, чем более сложная разработка реализуется, но существует высокий риск, что приложение будет установлено на машине, которая не предоставляет необходимых прав. Обычно для приложения более предпочтительно знать в самом начале выполнения, где ему не предоставлены полномочия, а не в середине процесса выполнения.
Чтобы успешно запрашивать полномочия для сборки, нужно точно отслеживать, какие права использует сборка. В частности, необходимо знать о требованиях полномочий вызовов, которые делает сборка в других библиотеках классов, включая .NET Framework.
Три примера из файла
Затем запрашивается, отказывается ли сборка от доступа к диску
Ниже дан атрибут, который запрашивает для сборки необязательные полномочия, чтобы обеспечить доступ к неуправляемому коду:
В
данном сценарии можно было бы добавить этот атрибут в приложение, которое обращается к неуправляемому коду по крайней мере в одном месте. В таком случае мы определяем, что это полномочие является необязательным, предполагая, что приложение может выполняться без полномочия доступа к неуправляемому коду. Если сборке не предоставлены права для доступа к неуправляемому коду и она попытается это сделать, то будет порождаться исключение SecurityException, которое должно ожидаться приложением и соответственно обрабатываться.При рассмотрении требований полномочий для приложения обычно необходимо выбрать одну из следующих возможностей:
□ Запрос всех необходимых полномочий в начале выполнения и постепенное снижение требований или выход, если эти полномочия не предоставлены.
□ Отказ от запроса полномочий в начале выполнения, но готовность обрабатывать исключения безопасности внутри приложения.
Если сборка была сконфигурирована для использования атрибутов полномочий таким образом, мы сможем использовать утилиту permview.exe для просмотра полномочий, нацеливая ее на файл сборки, содержащий манифест сборки:
Вывод для приложения, использующего три показанных атрибута, будет выглядеть так.
В дополнение к запрашиваемым полномочиям можно также запросить целое множество прав сразу. Так как некоторые множества полномочий (