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


Требования связывания

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

Требование связывания происходит при JIT-компиляции и проверяет только непосредственно вызывающий код. Связывание происходит, когда ваш код привязывается к ссылке на тип, включая ссылки на указатели функций и вызовы методов. Если вызывающая сборка не имеет достаточных разрешений для связывания с кодом, связывание не разрешается, и при загрузке и запуске кода создается исключение во время выполнения. Требования связывания могут переопределяться в классах, наследующих код.

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

Модификаторы проверки стека Assert, Deny и PermitOnly не влияют на оценку требований связывания. Поскольку требования связывания не производят проверку стека, модификаторы проверки стека не оказывают влияния на требования связывания.

Если к методу, защищенному требованием связывания, производится доступ посредством отражения, то требование связывания проверяет непосредственный вызывающий объект кода, доступ к которому осуществляется через отражение. Это верно как при выполнении поиска метода, так и при его вызове через отражение. Например, код использует отражение для возврата объекта MethodInfo, предоставляющего метод, защищенный требованием связывания, а затем передает этот объект MethodInfo какому-либо другому коду, который использует этот объект для вызова исходного метода. В этом случае проверка требования связывания происходит дважды: один раз для кода, возвращающего объект MethodInfo, и еще раз для кода, вызывающего его.

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

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

В следующем фрагменте кода декларативно указывается, что любой код, связываемый с методом ReadData, должен иметь разрешение CustomPermission. Это разрешение — гипотетическое, его не существует в .NET Framework. Это требование осуществляется передачей атрибуту CustomPermissionAttribute флага SecurityAction.LinkDemand.

<CustomPermissionAttribute(SecurityAction.LinkDemand)> _
Public Shared Function ReadData() As String
    ' Access a custom resource.
End Function  
[CustomPermissionAttribute(SecurityAction.LinkDemand)]
public static string ReadData()
{
    // Access a custom resource.
}

См. также

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

Требования безопасности

Создание собственных разрешений доступа к коду

Добавление поддержки декларативной безопасности

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

Расширение метаданных с помощью атрибутов

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