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


Переопределение результатов проверки безопасности

Обновлен: Ноябрь 2007

Обычно проверка безопасности анализирует каждый вызывающий объект в стеке вызовов, чтобы убедиться, что у каждого вызывающего объекта имеется указанное разрешение. Тем не менее, результат проверки безопасности может быть переопределен путем вызова Assert, Deny или PermitOnly для отдельного объекта разрешения или объекта набора разрешений. В зависимости от того, какой из этих методов вызывается, можно заставить проверку безопасности завершиться успешно или потерпеть неудачу, несмотря на то, что разрешения всех вызывающих объектов в стеке могли остаться непроверенными.

Каждый раз, когда один метод вызывает другой, в стеке вызовов создается новый фрейм, сохраняющий сведения о вызываемом методе. (В этом контексте использование конструкторов и доступ к свойствам являются вызовами методов.) Каждый фрейм стека включает в себя информацию о любых вызовах Assert, Deny и PermitOnly, выполненных методом. Если вызывающий объект выполняет более одного вызова Assert, Deny или PermitOnly в рамках одного вызова метода, среда выполнения применяет следующие правила, способные изменить поведение переопределения:

  • Если при выполнении проверки стека среда выполнения обнаруживает более одного переопределения одного типа (например, два вызова Assert) в одном фрейме стека, второе переопределение приводит к созданию исключения.

  • Если в одном фрейме стека присутствует несколько переопределений, среда выполнения обрабатывает эти переопределения в следующем порядке: PermitOnly, затем Deny, и в последнюю очередь — Assert.

Для замены переопределения сначала вызовите соответствующий метод отмены (например, RevertAssert), а затем примените новое переопределение.

c2f7a0y2.alert_note(ru-ru,VS.90).gifПримечание.

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

Разработчикам приложений обычно нет необходимости использовать Assert, Deny или PermitOnly, а разработчики компонентов и библиотек классов нуждаются в их применении довольно редко. Однако переопределения безопасности оправданы в некоторых ситуациях, описанных в разделах, посвященных Assert, Deny и PermitOnly.

c2f7a0y2.alert_note(ru-ru,VS.90).gifПримечание.

При выполнении переопределения (Deny, Assert или PermitOnly) нужно отменить это разрешение, чтобы выполнить тот же тип переопределения в том же фрейме стека (то есть методе). В противном случае создается исключение SecurityException. Например, если отвергается разрешение P, следует восстановить статус этого разрешения, чтобы получить возможность отвергнуть другое разрешение, Q, в рамках того же метода.

Для отмены переопределения используйте один из перечисленных в следующей таблице статических методов.

Метод

Действие метода

CodeAccessPermission.RevertAll

Вызывает удаление и окончание действия всех предыдущих переопределений в текущем фрейме стека.

CodeAccessPermission.RevertAssert

Вызывает удаление и окончание действия всех предыдущих переопределений типа Assert в текущем фрейме стека.

CodeAccessPermission.RevertDeny

Вызывает удаление и окончание действия всех предыдущих переопределений типа Deny в текущем фрейме стека.

CodeAccessPermission.RevertPermitOnly

Вызывает удаление и окончание действия всех предыдущих переопределений типа PermitOnly в текущем фрейме стека.

См. также

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

Написание безопасных библиотек классов

Ссылки

Использование метода Assert

Использование метода Deny

Использование метода PermitOnly

Другие ресурсы

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