Funktionskompatibilitet för partiellt förtroende
Windows Communication Foundation (WCF) stöder en begränsad delmängd funktioner när den körs i en delvis betrodd miljö. Funktionerna som stöds i partiellt förtroende är utformade kring en specifik uppsättning scenarier enligt beskrivningen i avsnittet Distributionsscenarier som stöds.
Minimikrav för behörighet
WCF stöder en delmängd funktioner i program som körs under någon av följande standardnamnsbehörighetsuppsättningar:
Behörigheter för medelhögt förtroende
Internet Zone-behörigheter
Försök att använda WCF i delvis betrodda program med mer restriktiva behörigheter kan resultera i säkerhetsfel vid körning.
Kontrakt
Kontrakt omfattas av följande begränsningar när de körs under partiellt förtroende:
Tjänstklassen
[ServiceContract]
som implementerar gränssnittet måste varapublic
och ha enpublic
konstruktor. Om den definierar[OperationContract]
metoder måste dessa varapublic
. Om det i stället implementerar ett[ServiceContract]
gränssnitt kan dessa metodimplementeringar vara explicita ellerprivate
, förutsatt att[ServiceContract]
gränssnittet ärpublic
.När du använder
[ServiceKnownType]
attributet måste den angivna metoden varapublic
.[MessageContract]
klasser och deras medlemmar kan varapublic
.[MessageContract]
Om klassen definieras i programsammansättningen kan den varainternal
och hainternal
medlemmar.
Bindningar som tillhandahålls av systemet
Och BasicHttpBinding WebHttpBinding stöds fullt ut i en partiell förtroendemiljö. WSHttpBinding Stöds endast för transportsäkerhetsläge.
Bindningar som använder andra transporter än HTTP, till NetTcpBindingexempel , NetNamedPipeBinding, eller NetMsmqBinding, stöds inte när de körs i en partiell förtroendemiljö.
Anpassade bindningar
Anpassade bindningar kan skapas och användas i en partiell förtroendemiljö, men måste följa de begränsningar som anges i det här avsnittet.
Transporter
De enda tillåtna transportbindningselementen är HttpTransportBindingElement och HttpsTransportBindingElement.
Kodare
Följande kodare tillåts:
Textkodaren (TextMessageEncodingBindingElement).
Den binära kodaren (BinaryMessageEncodingBindingElement).
Kodaren för webbmeddelanden (WebMessageEncodingBindingElement).
MTOM-kodare (Message Transmission Optimization Mechanism) stöds inte.
Säkerhet
Delvis betrodda program kan använda WCF:s säkerhetsfunktioner på transportnivå för att skydda kommunikationen. Säkerhet på meddelandenivå stöds inte. Att konfigurera en bindning för att använda säkerhet på meddelandenivå resulterar i ett undantag vid körning.
Bindningar som inte stöds
Bindningar som använder tillförlitliga meddelanden, transaktioner eller säkerhet på meddelandenivå stöds inte.
Serialisering
DataContractSerializer Både och XmlSerializer stöds i en partiell förtroendemiljö. Användning av DataContractSerializer är dock föremål för följande villkor:
Alla serialiserbara
[DataContract]
typer måste varapublic
.Alla serialiserbara
[DataMember]
fält eller egenskaper i en[DataContract]
typ måste vara offentliga och läsa/skriva. Serialisering och deserialisering avreadonly
fält stöds inte när WCF körs i ett delvis betrott program.Programmeringsmodellen
[Serializable]
/ISerializable stöds inte i en partiell förtroendemiljö.Kända typer måste anges i kod- eller datornivåkonfigurationen (machine.config). Kända typer kan inte anges i konfiguration på programnivå av säkerhetsskäl.
Typer som implementerar IObjectReference utlöser ett undantag i en delvis betrodd miljö.
Mer information om säkerhet när du använder DataContractSerializer säkert i ett delvis betrott program finns i avsnittet Serialisering i Metodtips för partiellt förtroende.
Samlingstyper
Vissa samlingstyper implementerar både IEnumerable<T> och IEnumerable. Exempel är typer som implementerar ICollection<T>. Sådana typer kan implementera en public
implementering av GetEnumerator()
, och en explicit implementering av GetEnumerator()
. I det här fallet DataContractSerializer anropar implementeringen public
av GetEnumerator()
, och inte den uttryckliga implementeringen av GetEnumerator()
. Om ingen av GetEnumerator()
implementeringarna är public
och alla är explicita implementeringar anropar IEnumerable.GetEnumerator()
du DataContractSerializer .
För samlingstyper när WCF körs i en partiell förtroendemiljö, om ingen av GetEnumerator()
implementeringarna är public
, eller om ingen av dem är explicita gränssnittsimplementeringar, genereras ett säkerhetsfel.
NetDataContractSerializer
Många .NET Framework-samlingstyper som List<T>, Dictionary<TKey,TValue> ArrayListoch Hashtable stöds inte av NetDataContractSerializer delvis förtroende. Dessa typer har attributuppsättningen [Serializable]
, och som tidigare angavs i avsnittet Serialisering stöds inte det här attributet i partiellt förtroende. Behandlar DataContractSerializer samlingar på ett speciellt sätt och kan därmed komma runt denna begränsning, men NetDataContractSerializer har ingen sådan mekanism för att kringgå denna begränsning.
Typen DateTimeOffset stöds inte av det NetDataContractSerializer partiella förtroendet.
En surrogat kan inte användas med NetDataContractSerializer (med hjälp av mekanismen SurrogateSelector ) när den körs i partiellt förtroende. Observera att den här begränsningen gäller för användning av surrogat, inte serialisering av den.
Aktivera vanliga beteenden för körning
Tjänst- eller slutpunktsbeteenden som inte har markerats med AllowPartiallyTrustedCallersAttribute attributet (APTCA) som läggs till i< avsnittet commonBehaviors i en konfigurationsfil> körs inte när programmet körs i en partiell förtroendemiljö och inget undantag utlöses när detta inträffar. Om du vill framtvinga körning av vanliga beteenden måste du göra något av följande:
Markera ditt vanliga beteende med AllowPartiallyTrustedCallersAttribute attributet så att det kan köras när det distribueras som ett program med delvis förtroende. Observera att en registerpost kan ställas in på datorn för att förhindra att APTCA-markerade sammansättningar körs. .
Kontrollera att om programmet distribueras som ett fullständigt betrott program kan användarna inte ändra säkerhetsinställningarna för kodåtkomst för att köra programmet i en partiell förtroendemiljö. Om de kan göra det körs inte beteendet och inget undantag genereras. Se alternativet levelfinal med Caspol.exe (Code Access Security Policy Tool) för att säkerställa detta.
Ett exempel på ett vanligt beteende finns i How to: Lock Down Endpoints in the Enterprise (Så här gör du: Lås slutpunkter i Enterprise).
Konfiguration
Med ett undantag kan delvis betrodd kod bara läsa in WCF-konfigurationsavsnitt i den lokala app.config
filen. För att läsa in WCF-konfigurationsavsnitt som refererar till WCF-avsnitt i machine.config eller i en rotwebb.config-fil krävs ConfigurationPermission(Unrestricted). Utan den här behörigheten resulterar referenser till WCF-konfigurationsavsnitt (beteenden, bindningar) utanför den lokala konfigurationsfilen till ett undantag när konfigurationen läses in.
Det enda undantaget är konfiguration av känd typ för serialisering, enligt beskrivningen i avsnittet Serialisering i det här avsnittet.
Viktigt!
Konfigurationstillägg stöds endast när de körs under Fullständigt förtroende.
Diagnostik
Händelseloggning
Begränsad händelseloggning stöds under partiellt förtroende. Endast tjänstaktiveringsfel och spårnings-/meddelandeloggningsfel loggas i händelseloggen. Det maximala antalet händelser som kan loggas av en process är 5, för att undvika att skriva överdrivna meddelanden till händelseloggen.
Meddelandeloggning
Meddelandeloggning fungerar inte när WCF körs i en partiell förtroendemiljö. Om det är aktiverat under partiellt förtroende misslyckas inte tjänstaktiveringen, men inget meddelande loggas.
Spårning
Begränsade spårningsfunktioner är tillgängliga när de körs i en partiell förtroendemiljö. I -elementet <listeners>
i konfigurationsfilen är TextWriterTraceListener de enda typerna som du kan lägga till och den nya EventSchemaTraceListener. Användning av standarden XmlWriterTraceListener kan resultera i ofullständiga eller felaktiga loggar.
Spårningskällor som stöds är:
System.IdentityModel.Claims, System.IdentityModel.Policy, System.IdentityModel.Selectors och System.IdentityModel.Tokens.
Följande spårningskällor stöds inte:
Följande medlemmar i TraceOptions uppräkningen bör inte anges:
När du använder spårning i en partiell förtroendemiljö kontrollerar du att programmet har tillräcklig behörighet för att lagra utdata från spårningslyssnaren. När du till exempel använder TextWriterTraceListener för att skriva spårningsutdata till en textfil kontrollerar du att programmet har den nödvändiga FileIOPermission som krävs för att kunna skriva till spårningsfilen.
Kommentar
För att undvika att överbelasta spårningsfilerna med duplicerade fel inaktiverar WCF spårning av resursen eller åtgärden efter det första säkerhetsfelet. Det finns en undantagsspårning för varje misslyckad resursåtkomst, första gången ett försök görs att komma åt resursen eller utföra åtgärden.
WCF-tjänstvärd
WCF-tjänstvärden stöder inte partiellt förtroende. Om du vill använda en WCF-tjänst i partiellt förtroende ska du inte använda projektmallen WCF-tjänstbibliotek i Visual Studio för att skapa tjänsten. Skapa i stället en ny webbplats i Visual Studio genom att välja webbmallen för WCF-tjänsten, som kan vara värd för tjänsten på en webbserver där delvis förtroende för WCF stöds.
Andra begränsningar
WCF är vanligtvis begränsat till de säkerhetsöverväganden som åläggs det av värdprogrammet. Om WCF till exempel finns i ett XAML-webbläsarprogram (XBAP) omfattas det av XBAP-begränsningar, enligt beskrivningen i Windows Presentation Foundation Partial Trust Security.
Följande ytterligare funktioner är inte aktiverade när du kör indigo2 i en partiell förtroendemiljö:
Windows Management Instrumentation (WMI)
Händelseloggning är endast delvis aktiverad (se diskussion i avsnittet Diagnostik ).
Prestandaräknare
Användning av WCF-funktioner som inte stöds i en partiell förtroendemiljö kan resultera i undantag vid körning.
Olistade funktioner
Det bästa sättet att upptäcka att en del av informationen eller åtgärden inte är tillgänglig när den körs i en partiell förtroendemiljö är att försöka komma åt resursen eller utföra åtgärden i ett try
block och sedan catch
felet. För att undvika att överbelasta spårningsfilerna med duplicerade fel inaktiverar WCF spårning av resursen eller åtgärden efter det första säkerhetsfelet. Det finns en undantagsspårning för varje misslyckad resursåtkomst, första gången ett försök görs att komma åt resursen eller utföra åtgärden.