Переопределение результатов проверки безопасности
Обновлен: Ноябрь 2007
Обычно проверка безопасности анализирует каждый вызывающий объект в стеке вызовов, чтобы убедиться, что у каждого вызывающего объекта имеется указанное разрешение. Тем не менее, результат проверки безопасности может быть переопределен путем вызова Assert, Deny или PermitOnly для отдельного объекта разрешения или объекта набора разрешений. В зависимости от того, какой из этих методов вызывается, можно заставить проверку безопасности завершиться успешно или потерпеть неудачу, несмотря на то, что разрешения всех вызывающих объектов в стеке могли остаться непроверенными.
Каждый раз, когда один метод вызывает другой, в стеке вызовов создается новый фрейм, сохраняющий сведения о вызываемом методе. (В этом контексте использование конструкторов и доступ к свойствам являются вызовами методов.) Каждый фрейм стека включает в себя информацию о любых вызовах Assert, Deny и PermitOnly, выполненных методом. Если вызывающий объект выполняет более одного вызова Assert, Deny или PermitOnly в рамках одного вызова метода, среда выполнения применяет следующие правила, способные изменить поведение переопределения:
Если при выполнении проверки стека среда выполнения обнаруживает более одного переопределения одного типа (например, два вызова Assert) в одном фрейме стека, второе переопределение приводит к созданию исключения.
Если в одном фрейме стека присутствует несколько переопределений, среда выполнения обрабатывает эти переопределения в следующем порядке: PermitOnly, затем Deny, и в последнюю очередь — Assert.
Для замены переопределения сначала вызовите соответствующий метод отмены (например, RevertAssert), а затем примените новое переопределение.
Примечание. |
---|
Переопределения проверки стека никогда не должны выполняться в конструкторе класса, потому что код конструктора не обязательно будет выполняться в какой-либо определенный момент или в определенном контексте. Так как состояние стека вызовов в конструкторе класса определено нечетко, переопределения проверки стека, помещенные в конструкторы класса, могут привести к неожиданным и нежелательным результатам. |
Разработчикам приложений обычно нет необходимости использовать Assert, Deny или PermitOnly, а разработчики компонентов и библиотек классов нуждаются в их применении довольно редко. Однако переопределения безопасности оправданы в некоторых ситуациях, описанных в разделах, посвященных Assert, Deny и PermitOnly.
Примечание. |
---|
При выполнении переопределения (Deny, Assert или PermitOnly) нужно отменить это разрешение, чтобы выполнить тот же тип переопределения в том же фрейме стека (то есть методе). В противном случае создается исключение SecurityException. Например, если отвергается разрешение P, следует восстановить статус этого разрешения, чтобы получить возможность отвергнуть другое разрешение, Q, в рамках того же метода. |
Для отмены переопределения используйте один из перечисленных в следующей таблице статических методов.
Метод |
Действие метода |
---|---|
Вызывает удаление и окончание действия всех предыдущих переопределений в текущем фрейме стека. |
|
Вызывает удаление и окончание действия всех предыдущих переопределений типа Assert в текущем фрейме стека. |
|
Вызывает удаление и окончание действия всех предыдущих переопределений типа Deny в текущем фрейме стека. |
|
Вызывает удаление и окончание действия всех предыдущих переопределений типа PermitOnly в текущем фрейме стека. |
См. также
Основные понятия
Написание безопасных библиотек классов
Ссылки
Использование метода PermitOnly