Forderungen

Mithilfe des Sicherheitsforderungsaufrufs können Sie deklarativ oder imperativ die Berechtigungen angeben, über die direkte oder indirekte Aufrufer für den Zugriff auf die Bibliothek verfügen müssen. Direkte Aufrufer rufen explizit statische Methoden oder Instanzmethoden Ihrer Bibliothek auf, während indirekte Aufrufer statische Methoden oder Instanzmethoden einer anderen Bibliothek aufrufen, die wiederum Ihre Bibliothek aufruft. Bei Verwendung einer Forderung werden Anwendungen mit dem Code nur ausgeführt, wenn alle direkten und indirekten Aufrufer über die von der Forderung angegebenen Berechtigungen verfügen. Forderungen empfehlen sich besonders in Situationen, in denen die Klassenbibliothek geschützte Ressourcen verwendet, bei denen der Zugriff durch nicht vertrauenswürdigen Code verhindert werden soll. Forderungen können entweder mit imperativer oder mit deklarativer Syntax in Code platziert werden.

Beachten Sie, dass der Mehrzahl der Klassen in .NET Framework bereits Forderungen zugewiesen sind, sodass Sie bei der Verwendung einer Klasse, die auf eine geschützte Ressource zugreift, keine zusätzliche Forderung vornehmen müssen. Die StreamWriter-Klasse nimmt z. B. bei jedem Öffnen automatisch eine Sicherheitsforderung von FileIOPermission vor. Wenn Sie bei der Verwendung der StreamWriter-Klasse eine Forderung für FileIOPermission vornehmen, lösen Sie einen redundanten ineffizienten Stackwalk aus. Verwenden Sie Forderungen zum Schützen benutzerdefinierter Ressourcen, für die benutzerdefinierte Berechtigungen erforderlich sind.

Forderungen können entweder deklarativ oder imperativ sein.

Stackwalks

Forderungen führen eine Analyse (so genannte Stackwalks) aus, um Sicherheit zu erzwingen. Dabei wird jede aufrufende Funktion (oder Stapelrahmen) in der aktuellen Aufrufliste auf die angegebene Berechtigung überprüft. Beim Auslösen einer Forderung geschieht Folgendes:

  • Der Stackwalk beginnt am Stapelrahmen des Aufrufers und nicht am aktuellen Stapel, in dem die Forderung auftritt. Wenn Methode A beispielsweise Methode B aufruft und Methode B über eine Forderung verfügt, beginnt der Stackwalk am Stapelrahmen von Methode A. Methode B wird nie als Teil des Stackwalks ausgewertet.

  • Der Stackwalk verläuft durch die Aufrufliste, bis er den Programmeinstiegspunkt des Stapels (normalerweise die Main-Methode) erreicht bzw. bis ein Stackwalkmodifizierer, z. B. ein Assert, gefunden wird. Weitere Informationen zu Stackwalkmodifizierern finden Sie unter Überschreiben von Sicherheitsüberprüfungen.

  • Wenn eine Forderung und ein Stackwalkmodifizierer (beispielsweise ein Assert) für dieselbe Berechtigung auf demselben Stapelrahmen auftreten, hat die Forderung Vorrang.

  • Deklarative und imperative Syntax weisen keine Unterschiede im Verhalten auf.

  • Eine auf dem Programmeinstiegspunkt positionierte Forderung wird nie ausgewertet, da der Stackwalk immer am aufrufenden Stapelrahmen beginnt; in diesem Fall ist jedoch kein derartiger aufrufender Rahmen zur Auswertung vorhanden. Deshalb sind auf dem Programmeinstiegspunkt positionierte Forderungen immer erfolgreich.

Deklarative Forderungen

Deklarative Forderungen platzieren Informationen mithilfe von Attributen in den Metadaten des Codes. Sie können eine Forderung mit deklarativer Syntax entweder auf der Klassenebene oder auf der Methodenebene des Codes platzieren.

Wenn Sie eine deklarative Sicherheitsüberprüfung auf der Klassenebene platzieren, wird sie auf sämtliche Member der Klasse angewendet. Wenn Sie jedoch eine deklarative Sicherheitsüberprüfung auf der Memberebene platzieren, wird sie nur auf den betreffenden Member angewendet und überschreibt die ggf. vorhandene, auf der Klassenebene angegebene Berechtigung. Angenommen, Sie legen auf der Klassenebene fest, dass Berechtigung A erforderlich ist, und Sie geben für die Methode 1 dieser Klasse an, dass Berechtigung B erforderlich ist. Bei einem Aufruf von Methode 1 wird bei einer Sicherheitsüberprüfung nur nach Berechtigung B gesucht, andere Methoden der Klasse benötigen jedoch weiterhin Berechtigung A.

Im folgenden Beispiel wird eine deklarative Forderung der benutzerdefinierten Berechtigung CustomPermission für alle Aufrufer der ReadData-Methode platziert. Dies ist eine hypothetische benutzerdefinierte Berechtigung, die in .NET Framework nicht vorhanden ist. Die benutzerdefinierte Berechtigung verfügt über ein getrennt definiertes CustomPermissionAttribute, das die Forderung vornimmt. In diesem Fall wird der Typ der Forderung, die vom Attribut ausgeführt wird, mithilfe eines SecurityAction.Demand-Flags angegeben.

<CustomPermissionAttribute(SecurityAction.Demand, Unrestricted := True)>Public Shared Function  ReadData() As String
   'Read from a custom resource.
End Function
[CustomPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
public static string ReadData()
{
   //Read from a custom resource.
}

Imperative Forderungen

Imperative Forderungen werden auf der Methodenebene des Codes platziert, indem eine neue Instanz eines Berechtigungsobjekts erstellt und die Demand-Methode des betreffenden Objekts aufgerufen wird. Es ist nicht möglich, Forderungen mithilfe von imperativer Syntax auf der Klassenebene zu platzieren.

Die im Code platzierte imperative Forderung schützt den gesamten übrigen Code in der Methode, in der die Demand-Methode aufgerufen wird. Die Sicherheitsüberprüfung wird bei der Ausführung von Demand vorgenommen. Schlägt sie fehl, wird eine SecurityException ausgelöst, und der verbleibende Code in der betreffenden Methode bzw. im betreffenden Member wird nicht ausgeführt, wenn die SecurityException nicht abgefangen und behandelt wird.

Im folgenden Beispiel wird mithilfe imperativer Syntax eine Forderung für sämtliche Aufrufer der benutzerdefinierten Berechtigung CustomPermission platziert. Dieser Code erstellt eine neue Instanz der CustomPermission-Klasse, die das PermissionState.Unrestricted-Flag an den Konstruktor übergibt. Anschließend wird die Demand-Methode aufgerufen.

Public Shared Sub ReadData()
   Dim MyPermission As New CustomPermission(PermissionState.Unrestricted)
   MyPermission.Demand()
   'Read from a custom resource.
End Sub  
public static void ReadData()
{
   CustomPermission MyPermission = new CustomPermission(PermissionState.Unrestricted);
   MyPermission.Demand();

   //Read from a custom resource.
}
HinweisHinweis

64-Bit- und 32-Bit-Plattformen unterscheiden sich im Hinblick auf das Optimierungsverhalten für die Forderung.Auf 64-Bit-Plattformen werden die Berechtigungen der Assembly, in der die Forderung enthalten ist, nicht überprüft, wenn keine weiteren aufrufenden Assemblys vorhanden sind.Diese Optimierung hat jedoch keine Ausweitung von Berechtigungen zur Folge, da ein Stackwalk auch noch ausgeführt wird, wenn aufrufende Assemblys vorhanden sind.Auf 32-Bit-Plattformen werden durch die Forderung die Berechtigungen der Assembly, die die Forderung enthält, und alle aufrufenden Assemblys überprüft.

Siehe auch

Referenz

SecurityException

Konzepte

Erweitern von Metadaten mithilfe von Attributen

Sicherheitsforderungen

Codezugriffssicherheit

Erstellen von eigenen Codezugriffsberechtigungen

Hinzufügen der Unterstützung der deklarativen Sicherheit

Erstellen von sicheren Klassenbibliotheken