Поделиться через


Запрос разрешений

Важное примечаниеВажно

В версии .NET Framework 4 удалена поддержка среды выполнения для принудительного применения запросов разрешений RequestMinimum, RequestOptional и RequestRefuse.Информация данного раздела не относятся к коду, основанному на .NET Framework 4 или более поздних версиях.Дополнительные сведения об этом и других изменениях см. в разделе Изменения системы безопасности в платформе .NET Framework 4.

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

ПримечаниеПримечание

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

ПримечаниеПримечание

В платформе .NET Framework версии 3.5 с пакетом обновления 1 (SP1) и более поздних версиях приложения, расположенные в сетевых папках в интрасети, по умолчанию пользуются полным доверием.Если приложение рассчитано на работу из общей папки, то оно будет работать с полным доверием, как и приложение, расположенное на компьютере.Дополнительные сведения см. в разделе Выполнение приложений интранета с полным доверием.

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

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

  • Запрос разрешений помогает быть уверенным в том, что код получает только те разрешения, которые ему необходимы. Если код не получает лишних разрешений, он не может повредить ресурсы, защищенные этими дополнительными разрешениями, даже если будет использован вредоносным кодом или будет содержать ошибки, которыми можно управлять в целях повреждения ресурсов. Следует запрашивать только те разрешения, которые необходимы коду, и никаких больше.

  • Запрос разрешений позволяет администраторам узнавать, какой минимум разрешений необходим приложению, чтобы соответствующим образом настроить политику безопасности. Определить разрешения, которые необходимо предоставить приложению, можно на вкладке "Безопасность" страницы свойств проекта Visual Studio. Если администратор не имеет этой информации, приложение будет сложно администрировать.

Запрос разрешений информирует среду выполнения о том, какие разрешения нужны или же не нужны вашему приложению. Например, если приложение записывает данные на локальный жесткий диск, не пользуясь изолированным хранилищем, оно должно обладать разрешением FileIOPermission. Если код не запросит разрешение FileIOPermission и локальные параметры безопасности не позволят приложению получить данное разрешение, произойдет исключение безопасности, когда приложение попытается выполнить запись на диск. Даже если приложение может обработать это исключение, ему не будет разрешено осуществить запись на диск. Такое поведение может разочаровать пользователей, если ваше приложение — редактор текстов, которым они пользовались в течение длительного времени. С другой стороны, если приложение запросит разрешение FileIOPermission, а локальные параметры безопасности не позволят ему получить FileIOPermission, приложение создаст исключение уже при запуске, и пользователю не придется сталкиваться с проблемой потери результатов работы. Кроме того, если приложение запрашивает FileIOPermission и является доверенным приложением, администратор может скорректировать политику безопасности, чтобы позволить приложению выполняться с удаленного общего ресурса.

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

Для запроса разрешений необходимо знать, какие ресурсы и защищенные операции использует ваш код, а также какие разрешения защищают эти ресурсы и операции. Кроме того, необходимо следить за всеми ресурсами, к которым осуществляют доступ методы библиотек классов, вызываемых вашими компонентами. Список разрешений доступа к коду, включенных в .NET Framework, см. в разделе Разрешения.

В следующей таблице приведено описание типов запросов разрешений.

Запрос разрешения

Описание

Запрос минимальных разрешений (RequestMinimum)

Разрешения, необходимые коду для запуска.

Запрос дополнительных разрешений (RequestOptional)

Разрешения, которые код может использовать, но может успешно выполняться и без них. Этот запрос неявно отвергает все не запрошенные специально разрешения.

Запрос запрещенных разрешений (RequestRefuse)

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

Применение всех вышеуказанных запросов к встроенным наборам разрешений (Запрашивание встроенных наборов разрешений).

Встроенные наборы разрешений, включая Nothing, Execution, FullTrust, Internet, LocalIntranet и SkipVerification.

Применение всех вышеуказанных запросов к разрешениям в XML-кодировке (Запрашивание разрешений в XML-кодировке).

XML-представление (строка, содержащая закодированный в XML набор разрешений, или же местонахождение XML-файла, содержащего закодированный набор разрешений) желаемого набора разрешений.

Если указаны обязательные разрешения (с использованием RequestMinimum), то коду будут выданы все запрошенные разрешения, допускаемые политикой безопасности. Выполнение кода будет разрешено только в том случае, если он получит все требуемые разрешения.

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

См. также

Задачи

Практическое руководство. Запрос разрешения для именованного набора разрешений

Ссылки

FileIOPermission

SecurityAction.RequestMinimum

SecurityAction.RequestOptional

RequestRefuse

Основные понятия

Управление доступом для кода

Основы управления доступом для кода

Манифест сборки

Разрешения безопасности

Запрос разрешений в XML-кодировке

Политика безопасности .NET Framework