Přepisování kontrol zabezpečení

Obvykle kontrola zabezpečení zkontroluje každého volajícího v zásobníku volání, aby zajistila, že každý volající měl uděleno specifikované oprávnění. Nicméně můžete přepsat výsledek kontroly zabezpečení voláním Assert, Deny nebo PermitOnly na individuální objekt oprávnění nebo na objekt sady oprávnění. Podle toho, kterou z těchto metod voláte, můžete způsobit, že kontrola zabezpečení proběhne úspěšně nebo dojde k selhání, přestože oprávnění všech volajících v zásobníku by nebyla zkontrolována.

Důležitá poznámkaDůležité

V rozhraní .NET Framework verze 4 byla odebrána podpora modulu runtime pro vynucování následujících žádostí o oprávnění: Deny a RevertDeny.Tyto požadavky by neměly být použity v kódu, který je založen na rozhraní .NET Framework 4 nebo novějším. Další informace o této a dalších změnách naleznete v tématu Změny zabezpečení v rozhraní .NET Framework 4.

Pokaždé, když jedna metoda volá jinou, je generován nový rámec v zásobníku volání pro ukládání informací o volané metodě. (Použití konstruktorů a přístupových vlastností je v tomto kontextu považováno za volání metody.) Každý rámec zásobníku obsahuje informace o jakýchkoliv volání metody, které provede Assert, Deny nebo PermitOnly. Pokud volající používají ve stejném volání metody více než jednou Assert, Deny nebo PermitOnly, tak modul runtime aplikuje následující pravidla zpracování, které mohou ovlivnit chování přepsání:

  • Pokud během procházení zásobníku modul runtime zjistí více než jedno přepsání stejného typu (to znamená dvě volání Assert) v jednom rámci zásobníku, druhé přepsání způsobí vyvolání výjimky.

  • Pokud jsou různá přepsání přítomny ve stejném rámci zásobníku, modul runtime zpracuje tyto přepsání v následujícím pořadí: PermitOnly potom Deny a nakonec Assert.

Pro nahrazení přepsání nejdříve volejte příslušnou zpětnou metodu (například RevertAssert) a potom aplikujte nové přepsání.

PoznámkaPoznámka

Přepsání procházení zásobníku by nikdy nemělo být provedeno v konstruktoru třídy, protože kód konstruktoru třídy není zaručen provádět v libovolném specifickém bodě nebo v kontextu.Protože stav zásobníku volání v konstruktoru třídy není dobře definovaný, přepsání zásobníku volání umístěné v konstruktorech může produkovat neočekávané a nežádoucí výsledky.

Vývojáři aplikace obvykle nepotřebují použít Assert, Deny nebo PermitOnly a zřídka kdy je potřebují použít vývojáři komponent a knihovny tříd. Nicméně přepsání zabezpečení jsou vhodná v některých situacích, které jsou popsány v tématech Assert, Deny a PermitOnly.

PoznámkaPoznámka

Pokud provádíte přepsání (Deny, Assert nebo PermitOnly), musíte vrátit oprávnění předtím než můžete provést stejný druh přepsání ve stejném rámci zásobníku (tedy v metodě).V opačném případě je vyvolána SecurityException. Například pokud odepřete oprávnění P, je třeba toto oprávnění vrátit zpět a teprve potom můžete odepřít jiné oprávnění Q ve stejné metodě.

Pro vrácení přepsání použijte jednu ze statických metod uvedených v následující tabulce.

Metoda

Akce metody

CodeAccessPermission.RevertAll

Způsobí, že všechna předchozí přepsání pro aktuální rámec budou odstraněna a nebudou již v platnosti.

CodeAccessPermission.RevertAssert

Způsobí, že jakékoli předchozí volání Assert pro aktuální rámec bude odstraněno a nebude již v platnosti.

CodeAccessPermission.RevertDeny

Způsobí, že jakékoli předchozí volání Deny pro aktuální rámec bude odstraněno a nebude již v platnosti. Tato metoda je v rozhraní .NET Framework 4 zastaralá.

CodeAccessPermission.RevertPermitOnly

Způsobí, že jakékoli předchozí volání PermitOnly pro aktuální rámec bude odstraněno a nebude již v platnosti.

Viz také

Odkaz

Použití uplatnit metodu

pomocí odepřít metoda

metodou PermitOnly

Koncepty

Zabezpečení přístupu kódu

Psaní zabezpečených knihoven tříd