Share via


Außerkraftsetzen von Sicherheitsüberprüfungen

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 außer Kraft setzen, 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 Außerkraftsetzen auswirken können:

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

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

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

Hinweis

Außerkraftsetzungen 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 Außerkraftsetzungen 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. Sicherheitsaußerkraftsetzungen bieten sich jedoch in einigen Fällen an, die in den Abschnitten Assert, Deny und PermitOnly beschrieben sind.

Hinweis

Wenn Sie eine Außerkraftsetzung ausführen (Deny, Assert oder PermitOnly), müssen Sie die Berechtigung zurücksetzen, bevor dieselbe Außerkraftsetzungsart 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 Außerkraftsetzung 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

Referenz

Using the Assert Method
Using the Deny Method
Using the PermitOnly Method

Konzepte

Erstellen von sicheren Klassenbibliotheken

Weitere Ressourcen

Codezugriffssicherheit