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

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

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

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

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

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

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

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

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

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

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

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

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

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

Метод

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

CodeAccessPermission.RevertAll

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

CodeAccessPermission.RevertAssert

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

CodeAccessPermission.RevertDeny

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

CodeAccessPermission.RevertPermitOnly

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

См. также

Ссылки

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

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

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

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

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

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