Architecture Net или что такое Microsoft.NET?




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

Пример SimplePermissionAttributeRequest показывает, как использовать атрибуты для выдачи запросов на те или иные разрешения. В этом примере атрибут нужен для того, чтобы передать метаданные в сборку, для запуска которой требуется разрешение Centres JLPrincipal. Таким образом можно заранее узнать, какие компоненты конфликтуют с политикой безопасности.

[assembly: Secur: i_t у Permission (
SecurityAc t ion: : RequestMinimum,
ControlPrinc:ipal=true) ] ;
public _gc class PermAttrib
// класс сборицхнгка мусора PermAttrib
{
public:
static int Imain()
{

В перечислении SecurityAction имеется несколько значений, часть из которых можно применягь к: классу или методу, а часть, как в этом примере, — к сборке. К сборкам применяются RequestMinimum, RequestOptional И RequestRefuse. RequestMinimu-m указывает на те метаданные, чьи разрешения необходимы для запуска сборки. Reques-tOjptional указывает на те разрешения метаданных, которые сборке неплохо бы им:еть., но без которых, впрочем, она все-таки может выполняться. RequestRefuse указывает на те разрешения, от которых сборка хотела бы отказаться15.
Если в примере SimplePermissionAttributeRequest значение атрибута поменять на RequestRefuse, а затем этот пример запустить, то хотя сборка и будет загружена, попытка изменить политику приведет к запуску исключения SecurityException.
Остальные значения применяются к классам и методам. Значение LinkDemand нужно тогда, когда делается ссылка на некоторый тип. При этом требуется, чтобы непосредственно вызвавшая программа имела разрешение. Другие значения применяются во время выполнения. InheritanceDemand требует, чтобы разрешение имелось у производного класса. Assert (Утвердить), Deny (Запретить), PermitOnly и Demand (Требование) требуют именно то, что от них можно ожидать.
Вот пример требования FilelOPermission, применяемого к классу с помощью атрибута. Для файла требуется Al lAcce s s. Надо обязательно указывать полный путь к файлу.

[FilelOPermission(
SecurityAction::Demand,
All = "c:\\foo\\read.txt")]
public class Simple
// общедоступный Простой класс
{
};