Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Vlastnost ProtectionLevel se nachází v mnoha různých třídách, jako jsou třídy ServiceContractAttribute a OperationContractAttribute. Vlastnost určuje, jak je chráněna čá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. Například WS-Addressing hlavičky jsou 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.ProtectionLevelje způsob, jak může vývojář nastavit minimální úroveň, kterou musí vazba splňovat. Při nasazení služby může skutečná vazba zadaná v konfiguraci podporovat nebo nepodporovat minimální úroveň. Například ve výchozím nastavení BasicHttpBinding třída neposkytuje zabezpečení (i když je možné ji povolit). Použití s kontraktem, který má jiné nastavení nežNone, způsobí vyvolání výjimky.Pokud služba vyžaduje, aby minimum
ProtectionLevelpro všechny zprávy jeSign, 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 aplikace WCF (služby nebo klienti) pokud je to možné, nebudou nadměrně zabezpečovat část zprávy, ale budou se řídit minimální úrovní zabezpečení. Všimněte si také, že při použitíTransportjako 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
ProtectionLevelbuď naSignnebo naEncryptAndSign, musíte použít vazbu se zapnutým zabezpečením nebo bude vyvolána výjimka.Pokud vyberete vazbu, která umožňuje zabezpečení a nenastavíte
ProtectionLevelvlastnost nikde ve smlouvě, všechna data aplikace budou zašifrována a podepsána.Pokud vyberete vazbu, která nemá povolené zabezpečení (například
BasicHttpBindingtřída má ve výchozím nastavení zakázáno zabezpečení) aProtectionLevelnení 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
ProtectionLevelmož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 rovnocenné.
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í vlastností pro chyby a kontrakty zpráv vyžaduje pochopení použití těchto funkcí. Další informace naleznete v tématu Postupy: Nastavení vlastnosti ProtectionLevel a použití kontraktů zpráv.
závislost WS-Addressing
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-Addressing a v kontraktu je zadáno více úrovní ochrany. Například třída 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-Addressing, nastaví se všechny úrovně 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ě diagnostikuje. 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é
- ServiceContractAttribute
- OperationContractAttribute
- FaultContractAttribute
- MessageContractAttribute
- MessageHeaderAttribute
- MessageBodyMemberAttribute
- ProtectionLevel
- Zabezpečení služeb
- Postupy: Nastavení vlastnosti ProtectionLevel
- Určení a zpracování nedostatků v kontraktech a službách
- Použití kontraktů zpráv