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

Внимание!

Управление доступом для кода и частично доверенный кодCode Access Security and Partially Trusted Code

Платформа .NET Framework предоставляет механизм для принудительного применения различных уровней доверия к разным частям кода, выполняемым в одном и том же приложении. Этот механизм называется управлением доступом для кода.The .NET Framework provides a mechanism for the enforcement of varying levels of trust on different code running in the same application called Code Access Security (CAS). Управление доступом для кода в .NET Framework не следует использовать в качестве механизма обеспечения границ безопасности на основе происхождения кода или других аспектов, связанных с удостоверениями.Code Access Security in .NET Framework should not be used as a mechanism for enforcing security boundaries based on code origination or other identity aspects. Мы обновляем рекомендации с учетом того, что управление доступом для кода и прозрачный для системы безопасности код не будут поддерживаться в качестве механизма безопасности при работе с частично доверенным кодом, особенно с кодом неизвестного происхождения.We are updating our guidance to reflect that Code Access Security and Security-Transparent Code will not be supported as a security boundary with partially trusted code, especially code of unknown origin. Мы не рекомендуем загружать и выполнять код из неизвестных источников, не предприняв дополнительные меры безопасности.We advise against loading and executing code of unknown origins without putting alternative security measures in place.

Эта политика действует в отношении всех версий платформы .NET Framework, кроме платформы .NET Framework в составе Silverlight.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

Требование связывания вызывает проверку безопасности во время JIT-компиляции и выполняет проверку только непосредственно вызывающую сборку кода.A link demand causes a security check during just-in-time compilation and checks only the immediate calling assembly of your code. Связывание происходит, когда ваш код привязывается к ссылке на тип, включая ссылки на указатели функций и вызовы методов.Linking occurs when your code is bound to a type reference, including function pointer references and method calls. Если вызывающая сборка не имеет достаточных разрешений для связывания с кодом, связывание не разрешается, а при загрузке и запуске кода создается исключение времени выполнения.If the calling assembly does not have sufficient permission to link to your code, the link is not allowed and a runtime exception is thrown when the code is loaded and run. Требования связывания могут переопределяться в классах, наследующих от кода.Link demands can be overridden in classes that inherit from your code.

Обратите внимание, что полный обход стека не выполняется для этого типа требования, а код все равно подвержен атакам с заманиванием.Note that a full stack walk is not performed with this type of demand and that your code is still susceptible to luring attacks. Например если метод в сборке А защищен требованием связывания, непосредственный вызывающий объект в сборке Б оценивается на основе разрешений сборки б. Однако требование связывания не будет оценивать метод в сборке C, если он косвенно вызывает метод в сборке, с помощью метода в сборке б. Требование связывания определяет только те разрешения, непосредственные вызывающие объекты в непосредственно вызывающей сборке необходимы для связывания с кодом.For example, if a method in assembly A is protected by a link demand, a direct caller in assembly B is evaluated based on the permissions of Assembly B. However, the link demand will not evaluate a method in assembly C if it indirectly calls the method in assembly A using the method in assembly B. The link demand specifies only the permissions direct callers in the immediate calling assembly must have to link to your code. Оно не определяет, какие разрешения должны иметь все вызывающие объекты для запуска кода.It does not specify the permissions all callers must have to run your code.

Модификаторы обхода стека Assert, Deny и PermitOnly не влияют на оценку требований связывания.The Assert, Deny, and PermitOnly stack walk modifiers do not affect the evaluation of link demands. Поскольку требования связывания не выполняют обход стека, модификаторы обхода стека не оказывают влияния на требования связывания.Because link demands do not perform a stack walk, the stack walk modifiers have no effect on link demands.

Если методу, защищенному требованием связывания осуществляется через отражения, то требование связывания проверяет непосредственный вызывающий объект кода, доступ также через отражение.If a method protected by a link demand is accessed through Reflection, then a link demand checks the immediate caller of the code accessed through reflection. Это справедливо как для обнаружения метода, так и для вызова метода, выполненного при помощи отражения.This is true both for method discovery and for method invocation performed using reflection. Например, предположим, что код использует отражение для возврата MethodInfo объекта, представляющего метод, защищенный требованием связывания, а затем передает MethodInfo объект другой код, который использует объект для вызова исходного метода.For example, suppose code uses reflection to return a MethodInfo object representing a method protected by a link demand and then passes that MethodInfo object to some other code that uses the object to invoke the original method. В этом случае проверка требования связывания происходит дважды: один раз для кода, возвращающего MethodInfo объекта и один раз для кода, вызывающего его.In this case the link demand check occurs twice: once for the code that returns the MethodInfo object and once for the code that invokes it.

Примечание

Требование связывания, выполняемое в статическом конструкторе класса, не защищает конструктор, так как статические конструкторы вызываются системой за пределами пути выполнения кода приложения.A link demand performed on a static class constructor does not protect the constructor because static constructors are called by the system, outside the application's code execution path. В результате, когда требование связывания применяется ко всему классу, оно не может защитить доступ к статическому конструктору, хотя защищает остальную часть класса.As a result, when a link demand is applied to an entire class, it cannot protect access to a static constructor, although it does protect the rest of the class.

В следующем фрагменте кода декларативно указывается, что любой код, связываемый с методом ReadData, должен иметь разрешение CustomPermission.The following code fragment declaratively specifies that any code linking to the ReadData method must have the CustomPermission permission. Это гипотетическое разрешение, которого не существует в .NET Framework.This permission is a hypothetical custom permission and does not exist in the .NET Framework. Требование осуществляется посредством передачи SecurityAction.LinkDemand флаг CustomPermissionAttribute.The demand is made by passing a SecurityAction.LinkDemand flag to the CustomPermissionAttribute.

<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.  
}  

См. такжеSee also