Použití metody Deny

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, RequestMinimum, RequestOptional a RequestRefuse.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.

Volání metody Deny zabraňuje přístupu k prostředku, který je specifikován odepřeným oprávněním. Pokud váš kód volá metodu Deny a podřízený volající následně požaduje odepření oprávnění, kontrola zabezpečení selže, i když všichni volající mají oprávnění pro přístup k danému prostředku. Požadováné a odpírané oprávnění se nemusí přesně shodovat, aby metoda Deny měla účinek a požadované oprávnění nemusí být podmnožinu odepřeného oprávnění. Ale pokud průnik dvou oprávnění je prázdný (to znamená, pokud nemají nic společného), volání metody Deny nebude mít žádný vliv. Všimněte si, že metoda Deny nemůže přepsat hlubší kód v zásobníku volání, který provádí Assert. Pokud hlubší kód v zásobníku volat provádí Assert, tak hlubší kód může přistupovat k prostředku, který kód výše na zásobníku volání zakazuje.

Ve svém kódu můžete použít volání metody Deny, abyste chránili sami sebe před odpovědností, protože metoda Deny znemožňuje vašemu kódu, aby byl použit pro přístup k odepřenému prostředku. Nicméně volání metody Deny neblokuje budoucí kontrolní výrazy zabezpečení prováděné podřízenými volajícími.

Následující ilustrace ukazuje, co se stane, když použijete metodu Deny. Předpokládá se, že následující tvrzení o sestaveních A, B, C, D, E a oprávnění P1 jsou pravdivá:

  • P1 představuje právo pro čtení všech souborů na disku C.

  • Sestavením A, B, C, D a E bylo uděleno oprávnění P1.

  • Metoda F umisťuje požadavek na oprávnění P1.

  • Metoda C vytváří instanci třídy P1 a pak volá její metodu Deny.

  • Metoda A je obsažena v sestavení A, metoda B je obsažena v sestavení B atd.

Používání metody Deny

Vyžádání a odepření oprávnění

Volání Deny prováděné metodou C může ovlivnit výsledek požadavků na P1. Předpokládejme například, že metoda A volá B, B volá C, C volání E a E volá F. Protože metoda F přistupuje přímo k prostředku, který chrání P1, metoda F vyvolá kontrolu zabezpečení pro P1 voláním metody Demand náležící P1 (nebo použitím deklarativního požadavku). Tento požadavek způsobí, že modul runtime zkontroluje oprávnění všech volajících v zásobníku volání, počínaje sestavením E. Protože sestavení E bylo uděleno oprávnění P1, modul runtime pokračuje v přezkoumání oprávnění náležících sestavení C. Ale protože metoda C odmítla oprávnění P1, kontrola zabezpečení vyvolána metodou E v tomto okamžiku selže a je vyvolána výjimka SecurityException. Nezáleží na tom, zda sestavení C a jeho volajícím (sestavením A a B) bylo uděleno P1; kontrola zabezpečení stále selže. Protože metoda C volala metodu Deny, kód v sestaveních A a B nemůže přistupovat k prostředku, který je chráněn oprávněním P1.

Následující kód ukazuje deklarativní syntaxi pro přepsání kontroly zabezpečení pomocí metody Deny. V tomto příkladu syntaxe ReflectionPermission specifikuje dvě hodnoty: výčet SecurityAction a nastavení pro vlastnost TypeInformation. Vlastnost TypeInformation je nastavena na hodnotu true, aby specifikovala, že toto oprávnění představuje právo pro zobrazení soukromých členů prostřednictvím reflexe a SecurityAction.Deny je předána pro odepření tohoto oprávnění. Kompletní seznam hodnot, které můžete specifikovat naleznete u popisu ReflectionPermission. S tímto prohlášením zabezpečení nemůže metoda číst soukromé členy typu prostřednictvím reflexe.

Option Strict
Option Explicit
Imports System
Imports System.Security.Permissions
<ReflectionPermissionAttribute(SecurityAction.Deny, TypeInformation = true ")> Public Class 
MyClass1
   Public Sub New()
   End Sub
   Public Sub GetPublicMembers ()
      ' Access public members through reflection.
   End Sub
End Class
using System;
using System.Security.Permissions;

[ReflectionPermissionAttribute(SecurityAction.Deny, TypeInformation = true)]
public class MyClass
{
   public MyClass()
   {    
   }   

   public void GetPublicMembers()
   {
      //Access public members through reflection.
   }  
}

Následující kód ukazuje imperativní syntaxi pro přepsání kontroly zabezpečení pomocí metody Deny. V tomto příkladu je deklarován objekt ReflectionPermission a jeho konstruktoru je předána ReflectionPermissionFlag.TypeInformation, aby inicializoval současné oprávnění. Kód a volající nemohou být nikdy použity pro čtení soukromých položek prostřednictvím reflexe, když je volána metoda Deny.

Option Explicit
Option Strict
Imports System
Imports System.Security.Permissions
Public Class MyClass1
   Public Sub New()
   End Sub
   Public Sub ReadRegistry()
      Dim MyPermission As New ReflectionPermission (ReflectionPermissionFlag.TypeInformation)
      MyPermission.Deny()
      ' Access public members through reflection.
   End Sub 
End Class
using System;
using System.Security.Permissions;

public class MyClass {
   public MyClass() {    
   }   

   public void ReadRegistry() { 
      ReflectionPermission MyPermission = new ReflectionPermission (ReflectionPermissionFlag.TypeInformation);
      MyPermission.Deny();

      // Access public members through reflection.
   }  
}

Problémy kanonikalizace s použitím metody Deny

Měli byste být velmi opatrní při odepírání FileIOPermission, RegistryPermission, WebPermission, UrlIdentityPermission, SiteIdentityPermission, a EnvironmentPermission, protože jednotlivé soubory, položky registru, URL adresy a systémové cesty mohou být popsány pomocí více názvů. Například samotný soubor MyFile.log může být odkazován mnoha způsoby, včetně "c:\MyFile.log" a "\\MyMachineName\c$\MyFile.log". Vytvoříte-li oprávnění, které představuje přístup k "c:\MyFile.log" a potom toto oprávnění vašemu kódu odepřete, váš kód stále může být schopen přistupovat k souboru pomocí alternativní cesty "\\MyMachineName\c$\MyFile.log".

Můžete použít kombinaci PermitOnly a Deny, chcete-li se vyhnout problémům s kanonikalizací. PermitOnly vám umožňuje specifikovat pouze jeden z několika možných názvů pro prostředek a má vedlejší účinek odepírání přístupu k danému prostředku používajícímu jakýkoliv jiný název. Poté, co použijete PermitOnly pro specifikování jednoho povoleného názvu pro prostředek, měli byste použít metodu Deny, abyste zakázali přístup k prostředku, který používá tento název.

Následující kód používá kombinaci Deny a PermitOnly, aby zabránil kódu v přistupování k prostředku nazvanému MyLog.log. Tento kód také blokuje přístup k prostředku, který používá všechny alternativní názvy nebo cesty.

<FileIOPermissionAttribute(SecurityAction.PermitOnly, All := "C:\ "), FileIOPermissionAttribute(SecurityAction.Deny, All := "C:\MyLog.log")>
[FileIOPermissionAttribute(SecurityAction.PermitOnly, All = @"C:\ ")]
[FileIOPermissionAttribute(SecurityAction.Deny, All = @"C:\MyLog.log")] 

Viz také

Odkaz

SecurityAction

RegistryPermissionAttribute

Koncepty

Rozšíření metadat pomocí atributů

Přepisování kontrol zabezpečení

Zabezpečení přístupu kódu