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é |
---|
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á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á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 |
---|---|
Způsobí, že všechna předchozí přepsání pro aktuální rámec budou odstraněna a nebudou již v platnosti. |
|
Způsobí, že jakékoli předchozí volání Assert pro aktuální rámec bude odstraněno a nebude již v platnosti. |
|
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á. |
|
Způsobí, že jakékoli předchozí volání PermitOnly pro aktuální rámec bude odstraněno a nebude již v platnosti. |