Sdílet prostřednictvím


Požadavky

Můžete použít volání požadavku zabezpečení deklarativně nebo imperativně k určení oprávnění, které přímí nebo nepřímí volající musí mít pro přístup do vaší knihovny. Přímí volající explicitně volají statické nebo instanční metody z vaší knihovny, zatímco nepřímí volající volají statické nebo instanční metody z jiné knihovny, který volá vaší knihovnu. Použijete-li požadavek, jakákoli aplikace, která obsahuje váš kód, se provede pouze v případě, že všichni přímí a nepřímí volající mají oprávnění, které určuje požadavek. Požadavky jsou užitečné zejména v situacích, ve kterých používá vaše knihovna tříd chráněné prostředky, které nechcete zpřístupnit nedůvěryhodnému kódu. Požadavky mohou být umístěny v kódu pomocí imperativní nebo deklarativní syntaxe.

Všimněte si, že většina tříd v rozhraní .NET Framework již mají požadavky přidruženy, proto není nutné při každém použití třídy mít dodatečné požadavky, když třída přistupuje k chráněnému prostředku. Například třída StreamWriter automaticky provede požadavek zabezpečení pro FileIOPermission vždy, když je otevřen. Pokud provedete požadavek pro FileIOPermission když použijete třídu StreamWriter, způsobíte neefektivní a redundantní průchod zásobníku. Používejte požadavky k ochraně vlastních zdrojů, které vyžadují vlastní oprávnění.

Požadavky mohou být deklarativní nebo imperativní.

Průchody zásobníkem

Požadavky vynutí zabezpečení provedením analýzy (nazývané průchod zásobníkem), kde každá volající funkce (nebo rámec zásobníku) v aktuálním zásobníku volání je zkontrolována pro zadané oprávnění. Pokud je spuštěn požadavek, dojde k následujícím akcím.

  • Začne průchod zásobníkem v bloku zásobníku volajícího, ale ne aktuálního zásobníku, kde dojde k požadavku. Například pokud metoda A volá metodu B a metoda B má požadavek, průchod zásobníkem začíná rámcem zásobníku metody A. Metoda B nikdy není vyhodnocena jako část průchodu zásobníkem.

  • Průchod zásobníkem pokračuje přes zásobník volání, dokud nedosáhne vstupního bodu programu zásobníku (obvykle metoda Main) nebo dokud modifikátor průchodu zásobníkem, jako assert, není nalezen. Informace o modifikátorech průchodu zásobníkem naleznete v tématu Přepisování kontrol zabezpečení.

  • Když požadavek modifikátoru průchodu zásobníkem (assert, například) pro stejné oprávnění je zobrazen na stejném rámci zásobníku, požadavek přijímá nadřazený.

  • Deklarativní a imperativní syntaxe nevykazuje žádný rozdíl v chování.

  • Všimněte si, že požadavek umístněn ve vašem vstupním bodu programu nikdy nebude vyhodnocen, protože průchody zásobníkem vždy začínají voláním rámce zásobníku, ale v tomto případě není žádný takový volající rámec k vyhodnocení. Proto požadavky umístěné ve vstupním bodě programu budou vždy úspěšné.

Deklarativní požadavky

Deklarativní požadavky umisťují informace do metadat vašeho kódu pomocí atributů. Deklarativní syntaxi můžete použít k umístění požadavku do úrovně třídy nebo metody vašeho kódu.

Pokud umístíte deklarativní kontrolu zabezpečení na úroveň třídy, platí pro všechny členy třídy. Pokud však umístíte deklarativní kontrolu zabezpečení na úroveň člena, týká se pouze tohoto člena a přepíše oprávnění určeno na úrovni třídy, pokud takové existuje. Předpokládejme například, že zadáte na úrovni třídy, že PermissionA je požadováno a pro danou Method1 třídy určíte, že je požadováno PermissionB. Když je zavolána Method1, kontrola zabezpečení se podívá pouze pro PermissionB, ale jiné metody třída budou stále vyžadovat PermissionA.

Následující příklad uvádí deklarativní požadavek vlastního oprávnění nazývaný CustomPermission na všech volajících metody ReadData. Toto oprávnění je hypotetické vlastní oprávnění a neexistuje v rozhraní .NET Framework. Vlastní oprávnění má samostatně definovaný CustomPermissionAttribute, který umožňuje požadavky. V tomto případě přijímá příznak SecurityAction.Demand k určení typu požadavku, který atribut provede.

<CustomPermissionAttribute(SecurityAction.Demand, Unrestricted := True)>Public Shared Function  ReadData() As String
   'Read from a custom resource.
End Function
[CustomPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
public static string ReadData()
{
   //Read from a custom resource.
}

Imperativní požadavky

Naléhavé požadavky jsou umístěny na úrovni kódu metody vytvářením nové instance objektu oprávnění a voláním metody objektu Demand. Imperativní syntaxe nemůže být použita k umístění požadavků na úrovni třídy.

Imperativní požadavek, který umístíte do kódu, účinně chrání všechen zbývající kód v metodě, ve které je metoda Demand volána. Kontrola zabezpečení je prováděna, když je vykonáváno Demand; pokud kontrola zabezpečení selže, SecurityException je vyvolána a zbytek kódu v této metodě nebo členu není nikdy proveden, ledaže by byla SecurityException odchycena a zpracována.

Následující příklad používá imperativní syntaxi k umístění požadavku na všechny volající pro vlastní oprávnění CustomPermission. Tento kód vytvoří novou instanci třídy CustomPermission předáním příznaku PermissionState.Unrestricted konstruktoru. Metoda Demand je potom volána.

Public Shared Sub ReadData()
   Dim MyPermission As New CustomPermission(PermissionState.Unrestricted)
   MyPermission.Demand()
   'Read from a custom resource.
End Sub  
public static void ReadData()
{
   CustomPermission MyPermission = new CustomPermission(PermissionState.Unrestricted);
   MyPermission.Demand();

   //Read from a custom resource.
}
PoznámkaPoznámka

Optimalizace chování pro operace požadavku se liší mezi 64bitovými a 32bitovými platformami.Na 64bitových platformách nebude požadavek kontrolovat poskytnutí sady sestavení obsahující požadavek v případech, kde nejsou přítomny žádné další volající sestavení.Tato optimalizace však nezpůsobí zvýšení úrovně oprávnění, protože průchod zásobníkem se stále provádí, když jsou přítomny volající sestavení.Operace požadavku na 32bitových platformách zkontroluje poskytnutí sady sestavení obsahující požadavek a všechna volající sestavení.

Viz také

Odkaz

SecurityException

Koncepty

Rozšíření metadat pomocí atributů

Požadavky zabezpečení

Zabezpečení přístupu kódu

Vytvoření vlastního kódu přístupových oprávnění

Přidání deklarativní podpory zabezpečení

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