Verknüpfungsaufrufe
Aktualisiert: November 2007
Ein Verknüpfungsaufruf bewirkt eine Sicherheitsüberprüfung während der Just-In-Time-Kompilierung, wobei nur die direkt aufrufende Assembly des Codes überprüft wird. Die Verknüpfungen werden erstellt, wenn der Code an einen Typverweis, einschließlich Funktionszeigerverweisen und Methodenaufrufen, gebunden ist. Wenn die aufrufende Assembly nicht über die entsprechende Berechtigung zum Erstellen einer Verknüpfung mit dem Code verfügt, ist die Verknüpfung unzulässig, und beim Laden und Ausführen des Codes wird eine Laufzeitausnahme ausgelöst. Verknüpfungsaufrufe können in Klassen überschrieben werden, die vom Code erben.
Beachten Sie, dass bei diesem Typ von Forderung kein vollständiger Stackwalk durchgeführt wird und der Code immer noch anfällig für Täuschungsmanöver ist. Wenn eine Methode in Assembly A beispielsweise durch einen Verknüpfungsaufruf geschützt ist, wird ein direkter Aufrufer in Assembly B auf der Grundlage der Berechtigungen von Assembly B ausgewertet. Der Verknüpfungsaufruf wertet jedoch keine Methode in Assembly C aus, wenn die Methode in Assembly A mithilfe der Methode in Assembly B indirekt aufgerufen wird. Durch den Verknüpfungsaufruf werden nur die Berechtigungen angegeben, über die direkte Aufrufer in der unmittelbar aufrufenden Assembly verfügen müssen, um eine Verknüpfung zum Code herzustellen. Sie gibt jedoch nicht an, über welche Berechtigungen alle Aufrufer zum Ausführen des Codes verfügen müssen.
Die Stackwalkmodifizierer Assert, Deny und PermitOnly haben keinen Einfluss auf die Auswertung von Verknüpfungsaufrufen. Da Verknüpfungsaufrufe keinen Stackwalk ausführen, haben Stackwalkmodifizierer keinen Einfluss auf Verknüpfungsaufrufe.
Wenn auf eine durch einen Verknüpfungsaufruf geschützte Methode durch Reflektion zugegriffen wird, überprüft ein Verknüpfungsaufruf den direkten Aufrufer des Codes, auf den durch Reflektion zugegriffen wurde. Dies gilt sowohl für das Erkennen als auch für das Aufrufen der Methode, das mithilfe von Reflektion ausgeführt wird. Angenommen, Code gibt unter Verwendung von Reflektion ein MethodInfo-Objekt zurück, das eine durch einen Verknüpfungsaufruf geschützte Methode darstellt, und übergibt dieses MethodInfo-Objekt anschließend an anderen Code, der damit die ursprüngliche Methode aufruft. In diesem Fall wird die Verknüpfungsaufrufüberprüfung zweimal durchgeführt, einmal für den Code, der das MethodInfo-Objekt zurückgibt, und einmal für den Code, der dieses aufruft.
Hinweis: |
---|
Ein Verknüpfungsaufruf, der für einen statischen Klassenkonstruktor durchgeführt wird, schützt diesen Konstruktor nicht, da statische Konstruktoren vom System außerhalb des Codeausführungspfades der Anwendung aufgerufen werden. Dies hat zur Folge, dass ein Verknüpfungsaufruf den Zugriff auf einen statischen Konstruktor nicht schützen kann, wenn sie auf eine ganze Klasse angewendet wird, obwohl der Rest der Klasse durch sie geschützt ist. |
Im folgenden Codefragment wird deklarativ angegeben, dass sämtlicher Code mit einer Verknüpfung mit der ReadData-Methode über die CustomPermission-Berechtigung verfügen muss. Dies ist eine hypothetische benutzerdefinierte Berechtigung, die in .NET Framework nicht vorhanden ist. Die Forderung wird vorgenommen, indem ein SecurityAction.LinkDemand-Flag an das CustomPermissionAttribute übergeben wird.
<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.
}
Siehe auch
Konzepte
Erstellen von eigenen Codezugriffsberechtigungen
Hinzufügen der Unterstützung der deklarativen Sicherheit