Metodtips för partiellt förtroende
I den här artikeln beskrivs metodtips när du kör Windows Communication Foundation (WCF) i en partiell förtroendemiljö.
Serialization
Använd dessa metoder när du använder DataContractSerializer i ett delvis betrott program.
Alla serialiserbara typer måste uttryckligen markeras med attributet [DataContract]
. Följande tekniker stöds inte i en partiell förtroendemiljö:
- Markera klasser som ska serialiseras med SerializableAttribute.
- ISerializable Implementera gränssnittet så att en klass kan styra sin serialiseringsprocess.
Använda DataContractSerializer
Alla typer som har markerats
[DataContract]
med attributet måste vara offentliga. Icke-offentliga typer kan inte serialiseras i en partiell förtroendemiljö.Alla
[DataContract]
medlemmar i en serialiserbar[DataContract]
typ måste vara offentliga. En typ med en icke-offentlig[DataMember]
kan inte serialiseras i en partiell förtroendemiljö.Metoder som hanterar serialiseringshändelser (till exempel
OnSerializing
,OnSerialized
,OnDeserializing
ochOnDeserialized
) måste deklareras som offentliga. Både explicita och implicita implementeringar av OnDeserialization(Object) stöds dock.[DataContract]
typer som implementeras i sammansättningar som markerats med AllowPartiallyTrustedCallersAttribute får inte utföra säkerhetsrelaterade åtgärder i typkonstruktorn, eftersom DataContractSerializer inte anropar konstruktorn för det nyligen instansierade objektet under deserialiseringen. Mer specifikt måste följande vanliga säkerhetstekniker undvikas för[DataContract]
typer:Försöker begränsa partiell förtroendeåtkomst genom att göra typens konstruktor intern eller privat.
Begränsa åtkomsten till typen genom att lägga till en
[LinkDemand]
i typens konstruktor.Förutsatt att eftersom objektet har instansierats har alla valideringskontroller som tillämpas av konstruktorn skickats.
Använda IXmlSerializable
Följande metodtips gäller för typer som implementerar IXmlSerializable och serialiseras med hjälp av DataContractSerializer:
Implementeringarna GetSchema av den statiska metoden måste vara
public
.De instansmetoder som implementerar IXmlSerializable gränssnittet måste vara
public
.
Använda WCF från fullständigt betrodd plattformskod som tillåter anrop från delvis betrodda anropare
WCF:s partiella säkerhetsmodell förutsätter att alla anropare av en offentlig WCF-metod eller -egenskap körs i kodåtkomstsäkerhetskontexten för värdprogrammet. WCF förutsätter också att det bara finns en programsäkerhetskontext för varje AppDomain, och att den här kontexten upprättas vid AppDomain skapandet av en betrodd värd (till exempel av ett anrop till CreateDomain eller av ASP.NET Application Manager).
Kommentar
Code Access Security (CAS) har föråldrats i alla versioner av .NET Framework och .NET. De senaste versionerna av .NET följer inte CAS-anteckningar och skapar fel om CAS-relaterade API:er används. Utvecklare bör söka alternativa sätt att utföra säkerhetsuppgifter.
Den här säkerhetsmodellen gäller för användarskrivna program som inte kan kontrollera ytterligare CAS-behörigheter, till exempel användarkod som körs i ett Medium Trust ASP.NET-program. Dock måste fullständigt betrodd plattformskod (till exempel en tredjepartssammansättning som är installerad i den globala sammansättningscacheminnet och accepterar anrop från delvis betrodd kod) vara särskilt försiktig när du anropar till WCF för ett delvis betrott program för att undvika att införa säkerhetsrisker på programnivå.
Fullständig förtroendekod bör undvika att ändra CAS-behörighetsuppsättningen för den aktuella tråden (genom att anropa Assert, PermitOnlyeller Deny) innan du anropar WCF-API:er för delvis betrodd kod. Att hävda, neka eller på annat sätt skapa en trådspecifik behörighetskontext som är oberoende av säkerhetskontexten på programnivå kan leda till oväntat beteende. Beroende på programmet kan det här beteendet leda till säkerhetsrisker på programnivå.
Kod som anropar till WCF med hjälp av en trådspecifik behörighetskontext måste vara beredd att hantera följande situationer som kan uppstå:
Den trådspecifika säkerhetskontexten kanske inte bibehålls under åtgärdens varaktighet, vilket resulterar i potentiella säkerhetsfel.
Intern WCF-kod och eventuella användarinaktiverade återanrop kan köras i en annan säkerhetskontext än den som anropet ursprungligen initierades under. Dessa kontexter omfattar:
Programbehörighetskontexten.
Alla trådspecifika behörighetskontexter som tidigare skapats av andra användartrådar som används för att anropa WCF under livslängden för den aktuella körningen AppDomain.
WCF garanterar att delvis betrodd kod inte kan få fullständiga behörigheter om inte sådana behörigheter bekräftas av en fullständigt betrodd komponent innan den anropas till offentliga WCF-API:er. Det garanterar dock inte att effekterna av att hävda fullständigt förtroende är isolerade till en viss tråd, åtgärd eller användaråtgärd.
Vi rekommenderar att du undviker att skapa en trådspecifik behörighetskontext genom att anropa Assert, PermitOnlyeller Deny. Bevilja eller neka i stället behörigheten till själva programmet, så att ingen Assert, Deny, eller PermitOnly krävs.