Überschreiben von Sicherheitsüberprüfungen

Aktualisiert: November 2007

Bei einer Sicherheitsüberprüfung werden normalerweise alle Aufrufer in der Aufrufliste untersucht, um sicherzustellen, dass allen Aufrufern die angegebene Berechtigung erteilt wurde. Sie können das Ergebnis von Sicherheitsüberprüfungen jedoch überschreiben, indem Sie Assert, Deny oder PermitOnly für ein einzelnes Berechtigungsobjekt oder ein Berechtigungssatzobjekt aufrufen. Je nach aufgerufener Methode kann die Sicherheitsüberprüfung fehlschlagen oder funktionieren, selbst wenn die Berechtigungen der Aufrufer in der Aufrufliste nicht überprüft wurden.

Bei jedem Aufruf einer Methode durch eine andere Methode wird ein neuer Rahmen in der Aufrufliste generiert, in dem die Informationen über die aufgerufene Methode gespeichert werden. (Die Verwendung von Konstruktoren und der Zugriff auf Eigenschaften werden in diesem Kontext als Methodenaufrufe angesehen.) Jeder Rahmen in der Liste enthält Informationen zu allen Aufrufen von Assert, Deny und PermitOnly durch die Methode. Wenn ein Aufrufer Assert, Deny oder PermitOnly in demselben Methodenaufruf mehrfach verwendet, wendet die Laufzeit die folgenden Verarbeitungsregeln an, die sich auf das Verhalten beim Überschreiben auswirken können:

  • Wenn die Laufzeit während des Stackwalks ein mehrfaches Überschreiben desselben Typs, z. B. zwei Aufrufe von Assert, in einem Stapelrahmen entdeckt, wird beim zweiten Überschreiben eine Ausnahme ausgelöst.

  • Wenn in einem Stapelrahmen mehrere verschiedene Überschreibungen enthalten sind, verarbeitet die Common Language Runtime zuerst PermitOnly, danach Deny und abschließend Assert.

Um eine Überschreibung zu ersetzen, rufen Sie zunächst die entsprechende Methode zur Wiederherstellung auf (z. B. RevertAssert) und wenden anschließend die neue Überschreibung an.

Hinweis:

Überschreibungen von Stackwalks sollten nie in einem Klassenkonstruktor vorgenommen werden, da Code des Klassenkonstruktors nicht unbedingt an einem bestimmten Punkt oder in einem bestimmten Kontext ausgeführt wird. Da der Zustand der Aufrufliste in einem Klassenkonstruktor nicht genau definiert ist, können Überschreibungen des Stackwalks in Konstruktoren zu unerwarteten und unerwünschten Ergebnissen führen.

Assert, Deny und PermitOnly müssen von Anwendungsentwicklern normalerweise gar nicht und von Klassenbibliotheksentwicklern nur selten verwendet werden. Sicherheitsüberschreibungen bieten sich jedoch in einigen Fällen an, die in den Abschnitten Assert, Deny und PermitOnly beschrieben sind.

Hinweis:

Wenn Sie eine Überschreibung ausführen (Deny, Assert oder PermitOnly), müssen Sie die Berechtigung zurücksetzen, bevor dieselbe Überschreibungsart in demselben Stapelrahmen (d. h. Methode) ausgeführt werden kann. Andernfalls wird eine SecurityException ausgelöst. Wenn Sie z. B. eine Berechtigung B verweigern, müssen Sie diese Berechtigung zurücksetzen, bevor Sie eine weitere Berechtigung Q in derselben Methode verweigern können.

Setzen Sie eine Überschreibung mit einer der statischen Methoden zurück, die in der folgenden Tabelle aufgeführt sind.

Methode

Aktion der Methode

CodeAccessPermission.RevertAll

Veranlasst, dass alle vorhergehenden Überschreibungen für den aktuellen Rahmen entfernt werden und nicht mehr wirksam sind.

CodeAccessPermission.RevertAssert

Veranlasst, dass ein vorhergehendes Assert für den aktuellen Rahmen entfernt wird und nicht mehr wirksam ist.

CodeAccessPermission.RevertDeny

Veranlasst, dass ein vorhergehendes Deny für den aktuellen Rahmen entfernt wird und nicht mehr wirksam ist.

CodeAccessPermission.RevertPermitOnly

Veranlasst, dass ein vorhergehendes PermitOnly für den aktuellen Rahmen entfernt wird und nicht mehr wirksam ist.

Siehe auch

Konzepte

Erstellen von sicheren Klassenbibliotheken

Referenz

Verwenden der Assert-Methode

Verwenden der Deny-Methode

Verwenden der PermitOnly-Methode

Weitere Ressourcen

Codezugriffssicherheit