Delen via


Aanbevolen procedures voor gedeeltelijke vertrouwensrelaties

In dit artikel worden aanbevolen procedures beschreven bij het uitvoeren van WCF (Windows Communication Foundation) in een gedeeltelijke vertrouwensomgeving.

Serialization

Pas deze procedures toe wanneer u de DataContractSerializer in een gedeeltelijk vertrouwde toepassing gebruikt.

Alle serialiseerbare typen moeten expliciet worden gemarkeerd met het [DataContract] kenmerk. De volgende technieken worden niet ondersteund in een gedeeltelijke vertrouwensomgeving:

  • Markeringsklassen die moeten worden geserialiseerd met de SerializableAttribute.
  • ISerializable De interface implementeren zodat een klasse het serialisatieproces kan beheren.

DataContractSerializer gebruiken

  • Alle typen die zijn gemarkeerd met het [DataContract] kenmerk, moeten openbaar zijn. Niet-openbare typen kunnen niet worden geserialiseerd in een gedeeltelijke vertrouwensomgeving.

  • Alle [DataContract] leden in een serialiseerbare [DataContract] type moeten openbaar zijn. Een type met een niet-openbaar [DataMember] kan niet worden geserialiseerd in een gedeeltelijke vertrouwensomgeving.

  • Methoden voor het afhandelen van serialisatie-gebeurtenissen (zoals OnSerializingOnSerialized, , OnDeserializingen OnDeserialized) moeten als openbaar worden gedeclareerd. Zowel expliciete als impliciete implementaties van OnDeserialization(Object) worden echter ondersteund.

  • [DataContract] typen die zijn geïmplementeerd in assembly's die zijn gemarkeerd met de AllowPartiallyTrustedCallersAttribute functie mogen geen beveiligingsgerelateerde acties uitvoeren in de typeconstructor, omdat de DataContractSerializer constructor van het zojuist geïnstantieerde object niet wordt aangeroepen tijdens de deserialisatie. De volgende algemene beveiligingstechnieken moeten worden vermeden voor [DataContract] typen:

  • Poging om gedeeltelijke vertrouwenstoegang te beperken door de constructor van het type intern of privé te maken.

  • De toegang tot het type beperken door een [LinkDemand] aan de constructor van het type toe te voegen.

  • Ervan uitgaande dat alle validatiecontroles die door de constructor worden afgedwongen, zijn geslaagd omdat het object is geïnstantieerd.

IXmlSerializable gebruiken

De volgende aanbevolen procedures zijn van toepassing op typen die worden geïmplementeerd IXmlSerializable en geserialiseerd met behulp van:DataContractSerializer

  • De GetSchema implementaties van statische methoden moeten zijn public.

  • De instantiemethoden die de IXmlSerializable interface implementeren, moeten zijn public.

WCF van volledig vertrouwde platformcode gebruiken waarmee aanroepen van gedeeltelijk vertrouwde bellers worden toegestaan

In het WCF-gedeeltelijk vertrouwensbeveiligingsmodel wordt ervan uitgegaan dat een aanroeper van een openbare WCF-methode of -eigenschap wordt uitgevoerd in de CAS-context (Code Access Security) van de hostingtoepassing. WCF gaat er ook vanuit dat er slechts één toepassingsbeveiligingscontext bestaat voor elke AppDomaintoepassing en dat deze context wordt ingesteld bij AppDomain het maken door een vertrouwde host (bijvoorbeeld door een aanroep naar CreateDomain of door de ASP.NET Application Manager).

Notitie

Cas (Code Access Security) is afgeschaft in alle versies van .NET Framework en .NET. Recente versies van .NET respecteren geen CAS-aantekeningen en produceren fouten als CAS-gerelateerde API's worden gebruikt. Ontwikkelaars moeten alternatieve manieren zoeken om beveiligingstaken uit te voeren.

Dit beveiligingsmodel is van toepassing op door de gebruiker geschreven toepassingen die geen aanvullende CAS-machtigingen kunnen bevestigen, zoals gebruikerscode die wordt uitgevoerd in een Medium Trust-ASP.NET-toepassing. Volledig vertrouwde platformcode (bijvoorbeeld een assembly van derden die is geïnstalleerd in de algemene assemblycache en accepteert aanroepen van gedeeltelijk vertrouwde code) moet echter expliciet rekening houden bij het aanroepen van WCF namens een gedeeltelijk vertrouwde toepassing om beveiligingsproblemen op toepassingsniveau te voorkomen.

Code voor volledig vertrouwen moet voorkomen dat u de CAS-machtigingenset van de huidige thread wijzigt (door aan te roepen, PermitOnlyof Deny) voordat u WCF-API's aanroept Assertnamens gedeeltelijk vertrouwde code. Het bevestigen, weigeren of anderszins maken van een threadspecifieke machtigingscontext die onafhankelijk is van de beveiligingscontext op toepassingsniveau kan leiden tot onverwacht gedrag. Afhankelijk van de toepassing kan dit gedrag leiden tot beveiligingsproblemen op toepassingsniveau.

Code die wcF aanroept met behulp van een threadspecifieke machtigingscontext, moet worden voorbereid om de volgende situaties te verwerken die zich kunnen voordoen:

  • De threadspecifieke beveiligingscontext kan niet worden onderhouden voor de duur van de bewerking, wat tot potentiële beveiligingsonderzondering leidt.

  • Interne WCF-code en eventuele door de gebruiker geleverde callbacks kunnen worden uitgevoerd in een andere beveiligingscontext dan de code waaronder de aanroep oorspronkelijk is gestart. Deze contexten zijn onder andere:

    • De context van de toepassingsmachtiging.

    • Elke threadspecifieke machtigingscontext die eerder is gemaakt door andere gebruikersthreads die worden gebruikt om wcF aan te roepen tijdens de levensduur van de huidige uitvoering AppDomain.

WCF garandeert dat gedeeltelijk vertrouwde code geen volledige vertrouwensmachtigingen kan verkrijgen, tenzij dergelijke machtigingen door een volledig vertrouwd onderdeel worden assertieer voordat ze worden aangeroepen bij openbare WCF-API's. Het garandeert echter niet dat de effecten van het bevestigen van een volledige vertrouwensrelatie worden geïsoleerd voor een bepaalde thread, bewerking of gebruikersactie.

Vermijd als best practice het maken van threadspecifieke machtigingscontext door aan te roepen Assert, PermitOnlyof Deny. In plaats daarvan verleent of weigert u de bevoegdheid aan de toepassing zelf, zodat er geen Assert, Denyof PermitOnly vereist is.

Zie ook