Sdílet prostřednictvím


Osvědčené postupy částečné důvěryhodnosti

Tento článek popisuje osvědčené postupy při spouštění technologie Windows Communication Foundation (WCF) v prostředí s částečnou důvěryhodností.

Serializace

Tyto postupy použijte při použití DataContractSerializer v částečně důvěryhodné aplikaci.

Všechny serializovatelné typy musí být explicitně označeny atributem [DataContract] . Následující techniky nejsou podporovány v prostředí s částečnou důvěryhodností:

  • Označení tříd, které mají být serializovány SerializableAttributepomocí .
  • ISerializable Implementace rozhraní umožňující třídu řídit své serializace procesu.

Použití DataContractSerializer

  • Všechny typy označené atributem [DataContract] musí být veřejné. Neveřejné typy nelze serializovat v částečném důvěryhodném prostředí.

  • Všechny [DataContract] členy serializovatelného [DataContract] typu musí být veřejné. Typ s neveřejným [DataMember] typem nelze serializovat v částečném důvěryhodném prostředí.

  • Metody, které zpracovávají události serializace (například OnSerializing, OnSerialized, OnDeserializinga OnDeserialized) musí být deklarovány jako veřejné. Podporují se však explicitní i implicitní implementace OnDeserialization(Object) .

  • [DataContract] typy implementované v sestaveních označených AllowPartiallyTrustedCallersAttribute pomocí nesmí provádět akce související se zabezpečením v konstruktoru typu, protože DataContractSerializer nevolá konstruktor nově vytvořený objekt během deserializace. Konkrétně se u typů musí vyhnout [DataContract] následující běžné techniky zabezpečení:

  • Pokus o omezení částečného přístupu důvěryhodnosti vytvořením konstruktoru typu jako interní nebo privátní.

  • Omezení přístupu k typu přidáním do [LinkDemand] konstruktoru typu.

  • Za předpokladu, že objekt byl úspěšně vytvořena instance, všechny ověřovací kontroly vynucované konstruktorem úspěšně prošly.

Použití IXmlSerializable

Následující osvědčené postupy platí pro typy, které implementují IXmlSerializable a jsou serializovány pomocí :DataContractSerializer

  • Implementace GetSchema statické metody musí být public.

  • Metody instance, které implementují IXmlSerializable rozhraní, musí být public.

Použití WCF z plně důvěryhodného kódu platformy, který umožňuje volání z částečně důvěryhodných volajících

Model zabezpečení částečné důvěryhodnosti WCF předpokládá, že jakýkoli volající veřejné metody nebo vlastnosti WCF běží v kontextu zabezpečení přístupu kódu (CAS) hostitelské aplikace. WCF také předpokládá, že pro každý AppDomainexistuje pouze jeden kontext zabezpečení aplikace a že tento kontext je vytvořen při AppDomain vytváření důvěryhodným hostitelem (například voláním CreateDomain nebo správcem aplikací ASP.NET).

Poznámka:

Zabezpečení přístupu kódu (CAS) je zastaralé ve všech verzích rozhraní .NET Framework a .NET. Nedávné verze rozhraní .NET nedotknou poznámek CAS a generují chyby, pokud se používají rozhraní API související s casem. Vývojáři by měli hledat alternativní způsoby provádění úloh zabezpečení.

Tento model zabezpečení platí pro uživatelem napsané aplikace, které nemůžou uplatnit další oprávnění CAS, jako je například uživatelský kód spuštěný v aplikaci se střední důvěryhodností ASP.NET. Plně důvěryhodný kód platformy (například sestavení třetí strany, které je nainstalováno v globální mezipaměti sestavení a přijímá volání z částečně důvěryhodného kódu), musí při volání do WCF jménem částečně důvěryhodné aplikace věnovat explicitní pozornost, aby se zabránilo zavedení ohrožení zabezpečení na úrovni aplikace.

Kód úplné důvěryhodnosti by neměl měnit sadu oprávnění CAS aktuálního vlákna (voláním Assert, PermitOnlynebo Deny) před voláním rozhraní WCF API jménem částečně důvěryhodného kódu. Vytvoření kontextu oprávnění specifického pro vlákno, které je nezávislé na kontextu zabezpečení na úrovni aplikace, může způsobit neočekávané chování. V závislosti na aplikaci může toto chování vést k ohrožením zabezpečení na úrovni aplikace.

Kód, který volá wcf pomocí kontextu oprávnění specifického pro vlákno, musí být připravený na zpracování následujících situací, které mohou nastat:

  • Kontext zabezpečení specifický pro vlákno nemusí být zachován po dobu trvání operace, což vede k potenciálním výjimkám zabezpečení.

  • Interní kód WCF a všechny zpětná volání poskytovaná uživatelem se můžou spouštět v jiném kontextu zabezpečení než v kontextu zabezpečení, pod kterým bylo volání původně zahájeno. Mezi tyto kontexty patří:

    • Kontext oprávnění aplikace.

    • Jakýkoli kontext oprávnění specifický pro vlákno dříve vytvořený jinými uživatelskými vlákny používanými k volání wcf během doby života aktuálně spuštěného AppDomain.

WCF zaručuje, že částečně důvěryhodný kód nemůže získat oprávnění úplné důvěryhodnosti, pokud tato oprávnění nejsou uplatněna plně důvěryhodnou komponentou před voláním do veřejných rozhraní API WCF. Nezaručuje ale, že účinky uplatnění úplného vztahu důvěryhodnosti jsou izolované na konkrétní vlákno, operaci nebo akci uživatele.

Osvědčeným postupem je vyhnout se vytváření kontextu oprávnění specifického pro vlákno voláním Assert, PermitOnlynebo Deny. Místo toho udělte nebo odepřete oprávnění samotné aplikaci, aby nebyla vyžadována žádná AssertDeny, nebo PermitOnly je požadována.

Viz také