Разрешения безопасности
Среда CLR позволяет коду выполнять только те операции, на выполнение которых у кода есть разрешение. Среда выполнения использует объекты, называемые разрешениями, для наложения ограничений на управляемый код. В среде выполнения предусмотрены встроенные классы разрешений в нескольких пространствах имен, а также поддерживается проектирование и реализация нестандартных классов разрешений.
Существуют два вида разрешений, каждый из которых имеет особое назначение.
Разрешения для доступа к коду контролируют доступ к защищенному ресурсу или возможность выполнения защищенной операции.
Разрешения безопасности на основе ролей позволяют установить, имеет ли пользователь (или действующий от его имени агент) конкретное удостоверение или является ли он участником указанной роли. PrincipalPermission является единственным разрешением безопасности на основе ролей.
Разрешения безопасности могут определяться в форме класса разрешений (принудительная безопасность) или в виде атрибута, представляющего класс разрешений (декларативная безопасность). Базовым классом для разрешений безопасности является System.Security.CodeAccessPermission; базовый класс для атрибутов разрешений безопасности — System.Security.Permissions.CodeAccessSecurityAttribute.
Приложению, имеющему форму сборок, предоставляется набор разрешений во время его загрузки в домен приложения. Предоставление обычно выполняется с помощью заранее заданных наборов разрешений, определяемых методом SecurityManager.GetStandardSandbox. Предоставленный набор определяет разрешения, которые код получает для доступа к ресурсам. Среда выполнения предоставляет разрешения на основе исходного расположения кода (например, локальный компьютер, локальная интрасеть или Интернет). Если код загружен в песочницу, ему также могут быть предоставлены особые разрешения. Дополнительные сведения о запуске кода в "песочнице" см. в разделе Практическое руководство. Выполнение не вполне безопасного кода в изолированной среде.
Разрешения используются следующим образом.
Для кода библиотеки могут требоваться определенные разрешения у вызывающих его объектов. Если разместить в коде требование Demand для разрешения, то предполагается, что любой код, использующий данный код, может быть выполнен только при наличии этого разрешения. Требования можно использовать для определения наличия у вызывающего кода доступа к определенным ресурсам или для обнаружения удостоверения вызывающего кода.
Код может использовать разрешения, чтобы отказывать в доступе к ресурсам, которые необходимо защитить. С помощью SecurityAction.PermitOnly можно указать ограниченный набор разрешений, неявно исключая все другие разрешения. Однако не рекомендуется использовать PermitOnly для запрета доступа с целью защиты от преднамеренного злоумышленного использования. Вызванные сборки, в предоставленных наборах которых имеются неявно запрещенные разрешения, могут переопределять эти разрешения посредством выполнения SecurityAction.Assert для любых разрешений, которые им требуются. Например, если предоставлено только разрешение UIPermission и вызвана сборка, по свой природе имеющая разрешение FileIOPermission, эта сборка может просто выполнить Assert для FileIOPermission и выполнять операции с файлами. Единственным безопасным способом защиты ресурсов от ненадежного кода в вызываемых сборках является выполнение этого кода с представленным набором, которые не содержит этих разрешений.
См. также
Основные понятия
Разрешения безопасности на основе ролей