Princip úrovně ochrany

Vlastnost ProtectionLevel se nachází v mnoha různých třídách, jako ServiceContractAttribute jsou třídy a OperationContractAttribute třídy. Vlastnost určuje, jak je chráněná část (nebo celá) zprávy. Toto téma vysvětluje funkci Wcf (Windows Communication Foundation) a jeho fungování.

Pokyny k nastavení úrovně ochrany naleznete v tématu Postupy: Nastavení vlastnosti ProtectionLevel.

Poznámka:

Úrovně ochrany je možné nastavit pouze v kódu, ne v konfiguraci.

Základy

Abyste porozuměli funkci úrovně ochrany, platí následující základní příkazy:

  • Pro libovolnou část zprávy existují tři základní úrovně ochrany. Vlastnost (bez ohledu na výskyt) je nastavena na jednu z hodnot výčtu ProtectionLevel . Ve vzestupném pořadí ochrany zahrnují:

    • None.

    • Sign. Chráněná část je digitálně podepsaná. Tím se zajistí detekce jakýchkoli manipulací s chráněnou částí zprávy.

    • EncryptAndSign. Část zprávy je zašifrovaná, aby se zajistila důvěrnost před podepsáním.

  • Požadavky na ochranu můžete nastavit pouze pro data aplikací pomocí této funkce. Hlavičky WS-Adres jsou například data infrastruktury, a proto nejsou ovlivněny ProtectionLevel.

  • Pokud je režim zabezpečení nastaven na Transport, je celá zpráva chráněna transportním mechanismem. Nastavení samostatné úrovně ochrany pro různé části zprávy proto nemá žádný vliv.

  • Vývojář ProtectionLevel může nastavit minimální úroveň , kterou musí vazba splňovat. Při nasazení služby může skutečná vazba zadaná v konfiguraci nebo nemusí podporovat minimální úroveň. Například ve výchozím nastavení BasicHttpBinding třída neposkytuje zabezpečení (i když je možné ji povolit). Proto ho použijete se kontraktem, který má jiné nastavení, než None způsobí vyvolání výjimky.

  • Pokud služba vyžaduje, aby minimum ProtectionLevel pro všechny zprávy je Sign, klient (možná vytvořený technologií mimo WCF) může šifrovat a podepsat všechny zprávy (což je více než minimum požadované). V tomto případě WCF nevyvolá výjimku, protože klient provedl více než minimum. Upozorňujeme však, že pokud je to možné, aplikace WCF (služby nebo klienti) nepřebezpečí část zprávy, ale bude vyhovovat minimální úrovni. Všimněte si také, že při použití Transport jako režimu zabezpečení může přenos přebezpečit datový proud zpráv, protože není ze své podstaty schopen zabezpečit na podrobnější úrovni.

  • Pokud explicitně nastavíte ProtectionLevel buď Sign nebo EncryptAndSign, musíte použít vazbu s povoleným zabezpečením nebo bude vyvolán výjimka.

  • Pokud vyberete vazbu, která umožňuje zabezpečení a nenastavíte ProtectionLevel vlastnost nikde ve smlouvě, všechna data aplikace budou zašifrována a podepsána.

  • Pokud vyberete vazbu, která nemá povolené zabezpečení (například BasicHttpBinding třída má ve výchozím nastavení zakázáno zabezpečení) a ProtectionLevel není explicitně nastavená, žádná data aplikace nebudou chráněna.

  • Pokud používáte vazbu, která používá zabezpečení na úrovni přenosu, budou všechna data aplikace zabezpečená podle možností přenosu.

  • Pokud použijete vazbu, která použije zabezpečení na úrovni zprávy, budou data aplikace zabezpečená podle úrovní ochrany nastavených pro kontrakt. Pokud nezadáte úroveň ochrany, budou šifrována a podepsána všechna data aplikace ve zprávách.

  • Tato ProtectionLevel možnost je možné nastavit na různých úrovních rozsahu. K oboru je přidružená hierarchie, která je vysvětlená v další části.

Vymezení problému

ProtectionLevel Nastavení nejvyššího rozhraní API nastaví úroveň pro všechny úrovně pod ním. ProtectionLevel Pokud je nastavená na jinou hodnotu na nižší úrovni, všechna rozhraní API pod touto úrovní v hierarchii se teď resetují na novou úroveň (rozhraní API nad ní však budou nadále ovlivněna nejvyšší úrovní). Hierarchie je následující. Atributy na stejné úrovni jsou partnerské vztahy.

Programovací úroveň ochrany

Chcete-li programovat ProtectionLevel v libovolném bodě v hierarchii, jednoduše nastavte vlastnost na odpovídající hodnotu při použití atributu. Příklady naleznete v tématu Postupy: Nastavení Vlastnosti ProtectionLevel.

Poznámka:

Nastavení vlastnosti chyb a kontraktů zpráv vyžaduje pochopení, jak tyto funkce fungují. Další informace naleznete v tématu Postupy: Nastavení vlastnosti ProtectionLevel a použití kontraktů zpráv.

Závislost ws-adresování

Ve většině případů použití nástroje ServiceModel Metadata Utility (Svcutil.exe) k vygenerování klienta zajišťuje, že klient a kontrakty služeb jsou identické. Zdánlivě identické kontrakty však mohou způsobit, že klient vyvolá výjimku. K tomu dochází vždy, když vazba nepodporuje specifikaci WS-Adresování a více úrovní ochrany jsou zadány ve smlouvě. Třída například BasicHttpBinding nepodporuje specifikaci nebo pokud vytvoříte vlastní vazbu, která nepodporuje ws-Adresování. Tato ProtectionLevel funkce spoléhá na specifikaci WS-Addressing, která umožňuje různé úrovně ochrany u jednoho kontraktu. Pokud vazba nepodporuje specifikaci WS-Adresování, všechny úrovně budou nastaveny na stejnou úroveň ochrany. Účinná úroveň ochrany pro všechny obory smlouvy bude nastavena na nejsilnější úroveň ochrany použitou ve smlouvě.

To může na první pohled způsobit problém, který se obtížně ladí. Je možné vytvořit kontrakt klienta (rozhraní), který obsahuje metody pro více než jednu službu. To znamená, že stejné rozhraní se používá k vytvoření klienta, který komunikuje s mnoha službami, a jediné rozhraní obsahuje metody pro všechny služby. Vývojář se v tomto vzácném scénáři musí postarat o vyvolání pouze těch metod, které platí pro každou konkrétní službu. Pokud je vazbou BasicHttpBinding třída, nelze podporovat více úrovní ochrany. Služba, která odpovídá klientovi, ale může odpovědět klientovi s nižší úrovní ochrany, než je vyžadováno. V takovém případě klient vyvolá výjimku, protože očekává vyšší úroveň ochrany.

Tento problém ilustruje příklad kódu. Následující příklad ukazuje službu a kontrakt klienta. Předpokládejme, že vazbou je element basicHttpBinding>.< Proto všechny operace na smlouvě mají stejnou úroveň ochrany. Tato úroveň jednotné ochrany se určuje jako maximální úroveň ochrany napříč všemi operacemi.

Smlouva o poskytování služeb je:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

Následující kód ukazuje rozhraní klientského kontraktu. Všimněte si, že obsahuje metodu Tax , která má být použita s jinou službou:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract()]
    int Tax();

    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract()> _
    Function Tax() As Integer

    <OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

Když klient volá metodu Price , vyvolá výjimku, když obdrží odpověď ze služby. K tomu dochází, protože klient nezadá ProtectionLevel na objektu ServiceContractAttribute, a proto klient používá výchozí (EncryptAndSign) pro všechny metody, včetně Price metody. Služba však vrací hodnotu pomocí Sign úrovně, protože kontrakt služby definuje jednu metodu, která má nastavenou úroveň Signochrany . V takovém případě klient vyvolá chybu při ověřování odpovědi ze služby.

Viz také