(см. ниже) демонстрируют использование атрибутов для запроса полномочий. Эти примеры можно найти в проекте
SecurityАрр9
среди загружаемых с сайта издательства Wrox файлов. Первый атрибут выдвигает требование, чтобы сборка имела
UIPermission
, что даст приложению доступ к интерфейсу пользователя. Запрос делается для минимальных полномочий, а если это право не предоставляется, то сборка не сможет запуститься.
В данном сценарии можно было бы добавить этот атрибут в приложение, которое обращается к неуправляемому коду по крайней мере в одном месте. В таком случае мы определяем, что это полномочие является необязательным, предполагая, что приложение может выполняться без полномочия доступа к неуправляемому коду. Если сборке не предоставлены права для доступа к неуправляемому коду и она попытается это сделать, то будет порождаться исключение SecurityException, которое должно ожидаться приложением и соответственно обрабатываться.
При рассмотрении требований полномочий для приложения обычно необходимо выбрать одну из следующих возможностей:
□ Запрос всех необходимых полномочий в начале выполнения и постепенное снижение требований или выход, если эти полномочия не предоставлены.
□ Отказ от запроса полномочий в начале выполнения, но готовность обрабатывать исключения безопасности внутри приложения.
Если сборка была сконфигурирована для использования атрибутов полномочий таким образом, мы сможем использовать утилиту permview.exe для просмотра полномочий, нацеливая ее на файл сборки, содержащий манифест сборки:
permview.exe assembly.dll
Вывод для приложения, использующего три показанных атрибута, будет выглядеть так.
дополнение к запрашиваемым полномочиям можно также запросить целое множество прав сразу. Так как некоторые множества полномочий (
Internet
,
LocalIntranet
и
Everything
) изменяются с помощью политики безопасности при выполнении сборки, то они запрашиваться не могут. Например, если сборка сообщила, что ей необходимо предоставить для выполнения все полномочия в множестве полномочий
LocalIntranet
, а администратор затем сузил множество прав
LocalIntranet
во время выполнения приложения, то может быть неизвестно, в каком множестве прав происходит работа.
Существует три множества полномочий, которые нельзя изменить во время выполнения приложения, эти множества могут запрашиваться с помощью атрибутов:
□
Nothing
□
Execution
□
FullTrust
Вот пример того, как запрашивается встроенное множество полномочий:
В этом примере сборка запрашивает, как минимум, встроенное множество полномочий
FullTrust
. Если это множество не будет предоставлено, то сборка породит во время выполнения исключение безопасности.
Неявное полномочие
Часто, когда предоставлена некоторые полномочия, возникает неявное утверждение, что также даны и другие полномочия. Например, если присвоено полномочие
FileIOPermission
для
C:\
, то неявно предполагается, что также имеется доступ к его подкаталогам (допущение системы безопасности учетных записей Windows).
Если необходимо проверить, что данное полномочие неявно вносит другое полномочие в качестве подмножества, то можно сделать следующее.
// Пример из SecurityApp5
class Class1 {
static void Main(string[ ] args) {
CodeAccessPermission permissionA =
new FileIOPermission(FileIOPermissionAccess.AllAccess, @"C:\");
CodeAccessPermission permissionB =
new FileIOPermission(FileIOPermissionAccess.Read, @"C:\temp");
if (permissions.IsSubsetOf(permissionA) {
Console.WriteLine("PermissionB is a subset of PermissionA");