LinkDemand в основном требует, чтобы вызывающий код имел указанное разрешение. Спрос, с другой стороны, требует, чтобы не только вызывающий код имел указанное разрешение, но также и код, который вызывал вызывающий код, и код, который вызывал это, и так далее, вплоть до стека (или до Утверждение найдено; см. Ниже).
LinkDemand может быть принудительно применен во время компиляции JIT, потому что, если JIT-компилятор попадает в оператор, который вызывает метод с LinkDemand, он может сразу определить, имеет ли вызывающий код разрешение или нет. Требование должно быть принудительно выполнено во время выполнения каждый раз, когда вызывается метод, потому что во время компиляции невозможно знать, что будет в стеке во время любого данного вызова. Таким образом, LinkDemand намного эффективнее. Тем не менее, компромисс для этой эффективности меньше безопасности. С LinkDemand вы доверяете тому, что вызывающий код не позволит ITS вызывающему коду (который может иметь или не иметь разрешения) использовать его в гнусных целях. (Другими словами, вы доверяете тому, что в вызывающем коде нет дыр в безопасности, которые его вызывающие могут использовать для косвенного доступа к методу с помощью LinkDemand.) С Demand вы знаете, что все в стеке абсолютно имеют разрешение (в по крайней мере, до тех пор, пока не будет найден Assert), поэтому нет риска для ненадежных абонентов.
Assert - это, по сути, короткое замыкание для спроса. Проверка безопасности, которая происходит с Demand, прекращается, если у вызывающего в стеке есть активный Assert (другими словами, разрешение должны иметь только вызывающие в стеке до Assert). Поэтому, как и LinkDemand, вы должны верить, что код с Assert не может быть использован его вызывающими.
Запрет также является коротким замыканием для Спрос, но вместо утверждения разрешения он отменяет разрешение, которое может иметь вызывающий абонент. Вы могли бы использовать это, чтобы предотвратить возможные дыры в безопасности, гарантируя, что никакие посторонние разрешения не действуют во время вызова, который может быть использован.
PermitOnly похож на Deny, за исключением того, что вместо отказа в конкретном разрешении он запрещает каждое разрешение, КРОМЕ указанного.
InheritanceDemand, в отличие от других, не имеет прямого отношения к вызовам методов, но говорит, что класс, который не имеет разрешения, не может наследовать от класса с InheritanceDemand. Это может быть использовано, например, для предотвращения доступа ненадежного кода к защищенным членам класса, которые в противном случае были бы доступны для классов-потомков.