Понимание параметра .NET в «SecurityAction» для разрешения

голоса
5

Может кто-нибудь объяснить смысл и цели значений для перечисления SecurityAction?

На странице MSDN не очень понятная. Это говорит LinkDemand происходит точно в момент компиляции, тогда как спрос происходит во время выполнения.

Почему различие и в каких ситуациях я использовал бы LinkDemand в отличие от спроса?

Кроме того, какие случаи использования других интересных значений, таких как InheritenceDemand, Assert и PermitOnly.

Задан 09/12/2008 в 20:42
источник пользователем
На других языках...                            


1 ответов

голоса
19

LinkDemand в основном требует код вызова, чтобы иметь указанное разрешение. Спрос, с другой стороны, не требует не только вызывающий код, чтобы иметь указанное разрешение, но и код, называемый код вызова, и код, который под названием, что и так далее, вплоть до стека (или до тех пор, Утверждай найден; смотри ниже).

LinkDemand может быть приведен в исполнение в JIT время компиляции, потому что если JIT компилятор ударяет о том, что вызывает метод с LinkDemand, он может сразу определить, если вызывающий код имеет разрешение или нет. Спрос должен быть приведено в исполнение во время выполнения каждый раз при выполнении вызова к методу, потому что это не возможно, во время компиляции, чтобы узнать, что будет в стеке во время любого данного вызова. Таким образом, LinkDemand является гораздо более эффективным. Тем не менее, компромисс для этой эффективности меньше безопасности. С LinkDemand, вы доверяете, что вызывающий код не собирается позволить ITS телефонного кода (который может или не может иметь разрешения) использовать его для неблаговидных целей. (Другими словами, вы доверяете, что нет никаких отверстий безопасности в вызывающем коде, что его абоненты могут использовать, чтобы получить доступ косвенным методом с LinkDemand.) С Demand, вы знаете, что все в стеке абсолютно имеет разрешение (в крайней мере до в Assert найдено), так что нет никакого риска от ненадежных вызывающих абонентов.

Утверждайте в основном короткое замыкание для спроса. Проверка безопасности, что происходит с Demand останавливается, если абонент в стеке имеет активную Assert (другими словами, только абоненты в стек до Assert должны иметь разрешение). Так что, как LinkDemand, вы должны верить, что код с Assert не может быть использован его абонентами.

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

PermitOnly, как запретить, за исключением вместо того, чтобы отрицать определенное разрешение он отрицает все разрешения, за исключением указанных.

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

Ответил 09/12/2008 в 22:56
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more