링크 요청

링크 요청을 사용하면 Just-in-Time 컴파일 타임 보안 검사를 수행하며 코드의 직접 실행 호출 어셈블리만 검사합니다. 코드가 함수 포인터 참조 및 메서드 호출 등 형식 참조에 바인딩되면 링크가 이루어집니다. 코드를 링크할 수 있는 충분한 권한이 호출 어셈블리에 없으면 링크는 허용되지 않으며 코드가 로드되어 실행될 때 런타임 예외가 throw됩니다. 링크 요청은 코드에서 상속되는 클래스에서 재정의될 수 있습니다.

이런 형식의 요청으로는 전체 스택 워크가 수행되지 않으므로 코드는 악의적인 공격에 노출될 수 있습니다. 예를 들어 어셈블리 A에 있는 메서드가 링크 요청에 의해 보호되면 어셈블리 B에 있는 직접 호출자는 어셈블리 B의 권한에 따라 평가됩니다. 그러나 링크 요청이 어셈블리 B에 있는 메서드를 사용하여 어셈블리 A에 있는 메서드를 간접적으로 호출하는 경우 어셈블리 C에 있는 메서드를 평가하지 않습니다. 링크 요청은 직접 호출자가 직접 실행 호출 어셈블리에서 코드에 링크하기 위해 필요한 권한만을 지정합니다. 코드를 실행하기 위해 모든 호출자에게 요구되는 권한은 지정하지 않습니다.

Assert, DenyPermitOnly 스택 워크 한정자는 링크 요청의 평가에 영향을 주지 않습니다. 링크 요청이 스택 워크를 실행하지 않으므로 스택 워크 한정자는 링크 요청에 아무런 영향을 주지 않습니다.

링크 요청에 의해 보호되는 메서드를 리플렉션을 통해 액세스하면 링크 요청은 리플렉션을 통해 액세스되는 코드의 직접 실행 호출자를 검사합니다. 이런 방법은 리플렉션을 사용하여 수행되는 메서드 검색과 메서드 호출에 모두 사용할 수 있습니다. 예를 들어, 코드에서 리플렉션을 사용하여, 링크 요청에 의해 보호된 메서드를 나타내는 MethodInfo 개체를 반환한 후 원래의 메서드를 호출하기 위해 MethodInfo 개체를 사용하는 다른 코드로 이 개체를 전달하는 경우, 링크 요청 검사가 두 번 이루어집니다. MethodInfo 개체를 반환하는 코드와 메서드를 호출하는 코드에서 각각 한 번씩 검사됩니다.

참고참고

응용 프로그램 코드 실행 경로 밖에서 시스템이 정적 생성자를 호출하기 때문에 정적 클래스 생성자에서 수행된 링크 요청은 생성자를 보호하지 않습니다.따라서 링크 요청이 전체 클래스에 적용될 때 정적 생성자에 대한 액세스를 보호할 수 없습니다. 하지만 나머지 클래스는 보호할 수 있습니다.

다음 코드 조각에서는 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.
}

참고 항목

개념

특성을 사용하여 메타데이터 확장

보안 요청

사용자 고유의 코드 액세스 권한 만들기

선언적 보안 지원 추가

코드 액세스 보안