Dela via


Skydda klienter

I Windows Communication Foundation (WCF) dikterar tjänsten säkerhetskrav för klienter. Det innebär att tjänsten anger vilket säkerhetsläge som ska användas och om klienten måste ange en autentiseringsuppgift eller inte. Det är därför enkelt att skydda en klient: använd metadata som hämtas från tjänsten (om den publiceras) och skapa en klient. Metadata anger hur klienten ska konfigureras. Om tjänsten kräver att klienten tillhandahåller en autentiseringsuppgift måste du skaffa en autentiseringsuppgift som uppfyller kraven. I det här avsnittet beskrivs processen i detalj. Mer information om hur du skapar en säker tjänst finns i Skydda tjänster.

Tjänsten anger säkerhet

Som standard har WCF-bindningar säkerhetsfunktioner aktiverade. (Undantaget är BasicHttpBinding.) Om tjänsten skapades med WCF är det därför större risk att den implementerar säkerhet för att säkerställa autentisering, konfidentialitet och integritet. I så fall anger de metadata som tjänsten tillhandahåller vad som krävs för att upprätta en säker kommunikationskanal. Om tjänstens metadata inte innehåller några säkerhetskrav finns det inget sätt att införa ett säkerhetsschema, till exempel Secure Sockets Layer (SSL) via HTTP, på en tjänst. Men om tjänsten kräver att klienten anger en autentiseringsuppgift måste klientutvecklaren, distribueraren eller administratören ange de faktiska autentiseringsuppgifter som klienten ska använda för att autentisera sig till tjänsten.

Hämta metadata

När du skapar en klient är det första steget att hämta metadata för tjänsten som klienten ska kommunicera med. Detta kan göras på två sätt. Om tjänsten först publicerar en MEX-slutpunkt (Metadata Exchange) eller gör dess metadata tillgängliga via HTTP eller HTTPS kan du ladda ned metadata med hjälp av ServiceModel Metadata Utility Tool (Svcutil.exe), som genererar både kodfiler för en klient och en konfigurationsfil. (Mer information om hur du använder verktyget finns iÅtkomst till tjänster med hjälp av en WCF-klient.) Om tjänsten inte publicerar en MEX-slutpunkt och inte heller gör dess metadata tillgängliga via HTTP eller HTTPS, måste du kontakta tjänstens skapare för dokumentation som beskriver säkerhetskrav och metadata.

Viktigt!

Vi rekommenderar att metadata kommer från en betrodd källa och att de inte manipuleras. Metadata som hämtas med HTTP-protokollet skickas i klartext och kan manipuleras. Om tjänsten använder HttpsGetEnabled egenskaperna och HttpsGetUrl använder du url:en som tjänstens skapare angav för att ladda ned data med hjälp av HTTPS-protokollet.

Verifiera säkerhet

Metadatakällor kan delas in i två breda kategorier: förtroendekällor och ej betrodda källor. Om du litar på en källa och har laddat ned klientkoden och andra metadata från källans säkra MEX-slutpunkt kan du skapa klienten, ange rätt autentiseringsuppgifter och köra den utan några andra problem.

Men om du väljer att ladda ned en klient och metadata från en källa som du inte vet mycket om kontrollerar du de säkerhetsåtgärder som koden använder. Du får till exempel inte bara skapa en klient som skickar din personliga eller ekonomiska information till en tjänst om inte tjänsten kräver konfidentialitet och integritet (åtminstone). Du bör lita på tjänstens ägare i den utsträckning som du är villig att lämna ut sådan information, eftersom sådan information kommer att vara synlig för dem.

När du använder kod och metadata från en ej betrodd källa kontrollerar du därför därför koden och metadata för att säkerställa att den uppfyller den säkerhetsnivå som du behöver.

Ange en klientautentiseringsuppgift

Att ange en klientautentiseringsuppgift på en klient består av två steg:

  1. Fastställa vilken typ av klientautentiseringsuppgifter tjänsten kräver. Detta uppnås med en av två metoder. Om du först har dokumentation från tjänstens skapare bör den ange den klientautentiseringstyp (om någon) som tjänsten kräver. För det andra, om du bara har en konfigurationsfil som genereras av verktyget Svcutil.exe kan du undersöka de enskilda bindningarna för att avgöra vilken typ av autentiseringsuppgifter som krävs.

  2. Ange en faktisk klientautentiseringsuppgift. Den faktiska klientautentiseringsuppgiften kallas för ett värde för klientautentiseringsuppgifter för att skilja den från typen. Om till exempel klientautentiseringstypen anger ett certifikat måste du ange ett X.509-certifikat som utfärdas av en certifikatutfärdare som tjänsten litar på.

Fastställa klientens autentiseringstyp

Om du har skapat konfigurationsfilen Svcutil.exe verktyget kan du gå igenom <avsnittet bindningar> för att avgöra vilken typ av klientautentiseringsuppgifter som krävs. I avsnittet finns bindningselement som anger säkerhetskrav. Mer specifikt undersöker du säkerhetselementet> för <varje bindning. Det elementet innehåller mode attributet som du kan ange till ett av tre möjliga värden (Message, Transport, eller TransportWithMessageCredential). Värdet för attributet avgör läget och läget avgör vilket av de underordnade elementen som är betydande.

Elementet <security> kan innehålla antingen ett <transport> element eller <message> både och. Det viktiga elementet är det som matchar säkerhetsläget. Följande kod anger till exempel att säkerhetsläget är "Message"och klientens autentiseringstyp för elementet <message> är "Certificate". I det här fallet kan elementet <transport> ignoreras. Elementet <message> anger dock att ett X.509-certifikat måste anges.

<wsHttpBinding>  
    <binding name="WSHttpBinding_ICalculator">  
       <security mode="Message">  
           <transport clientCredentialType="Windows"
                      realm="" />  
           <message clientCredentialType="Certificate"
                    negotiateServiceCredential="true"  
                    algorithmSuite="Default"
                    establishSecurityContext="true" />  
       </security>  
    </binding>  
</wsHttpBinding>  

Observera att om clientCredentialType attributet är inställt på "Windows", som du ser i följande exempel, behöver du inte ange ett verkligt autentiseringsvärde. Det beror på att windows-integrerad säkerhet tillhandahåller den faktiska autentiseringsuppgiften (en Kerberos-token) för den person som kör klienten.

<security mode="Message">  
    <transport clientCredentialType="Windows "
        realm="" />  
</security>  

Ange värdet för klientens autentiseringsuppgifter

Om det fastställs att klienten måste ange en autentiseringsuppgift använder du lämplig metod för att konfigurera klienten. Om du till exempel vill ange ett klientcertifikat använder du SetCertificate metoden .

En vanlig form av autentiseringsuppgifter är X.509-certifikatet. Du kan ange autentiseringsuppgifterna på två sätt:

  • Genom att programmera den i klientkoden (med hjälp av SetCertificate metoden).

Genom att lägga till ett <beteendeavsnitt i konfigurationsfilen> för klienten och använda elementet clientCredentials (visas nedan).

Ange ett <clientCredentials-värde> i Kod

Om du vill ange ett <clientCredentials-värde> i kod måste du komma åt ClientCredentials egenskapen för ClientBase<TChannel> klassen. Egenskapen returnerar ett ClientCredentials objekt som ger åtkomst till olika typer av autentiseringsuppgifter, enligt följande tabell.

ClientCredential-egenskap beskrivning Kommentar
ClientCertificate Returnerar en X509CertificateInitiatorClientCredential Representerar ett X.509-certifikat som tillhandahålls av klienten för att autentisera sig till tjänsten.
HttpDigest Returnerar en HttpDigestClientCredential Representerar en HTTP-sammanfattad autentiseringsuppgift. Autentiseringsuppgifterna är en hash för användarnamnet och lösenordet.
IssuedToken Returnerar en IssuedTokenClientCredential Representerar en anpassad säkerhetstoken som utfärdats av en säkerhetstokentjänst, som ofta används i federationsscenarier.
Peer Returnerar en PeerCredential Representerar en peer-autentiseringsuppgift för deltagande i ett Peer-nät i en Windows-domän.
ServiceCertificate Returnerar en X509CertificateRecipientClientCredential Representerar ett X.509-certifikat som tillhandahålls av tjänsten i en out-of-band-förhandling.
UserName Returnerar en UserNamePasswordClientCredential Representerar ett användarnamn och lösenordspar.
Windows Returnerar en WindowsClientCredential Representerar en Windows-klientautentiseringsuppgift (en Kerberos-autentiseringsuppgift). Egenskaperna för klassen är skrivskyddade.

Ange ett <clientCredentials-värde> i konfigurationen

Autentiseringsvärden anges med hjälp av ett slutpunktsbeteende som underordnade element i elementet <clientCredentials> . Vilket element som används beror på klientens autentiseringstyp. I följande exempel visas till exempel konfigurationen för att ange ett X.509-certifikat med hjälp av <<clientCertificate.>

<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <endpointBehaviors>
        <behavior name="myEndpointBehavior">  
          <clientCredentials>  
            <clientCertificate findvalue="myMachineName"
            storeLocation="Current" X509FindType="FindBySubjectName" />  
          </clientCredentials>  
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>  
</configuration>  

Om du vill ange klientens autentiseringsuppgifter i konfigurationen lägger du till ett endpointBehaviors-element i konfigurationsfilen>.< Dessutom måste det tillagda beteendeelementet länkas till tjänstens slutpunkt med hjälp behaviorConfiguration av< attributet för klientelementets>< slutpunkt> enligt följande exempel. Värdet för behaviorConfiguration attributet måste matcha värdet för beteendeattributet name .

<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="http://localhost/servicemodelsamples/service.svc"
                binding="wsHttpBinding"
                bindingConfiguration="Binding1"
                behaviorConfiguration="myEndpointBehavior"
                contract="Microsoft.ServiceModel.Samples.ICalculator" />
    </client>
  </system.serviceModel>
</configuration>

Kommentar

Vissa av värdena för klientautentiseringsuppgifter kan inte anges med hjälp av programkonfigurationsfiler, till exempel användarnamn och lösenord eller Windows-användar- och lösenordsvärden. Sådana autentiseringsvärden kan endast anges i kod.

Mer information om hur du anger klientens autentiseringsuppgifter finns i Så här anger du värden för klientautentiseringsuppgifter.

Kommentar

ClientCredentialType ignoreras när SecurityMode är inställt på "TransportWithMessageCredential", enligt följande exempelkonfiguration.

<wsHttpBinding>  
    <binding name="PingBinding">  
        <security mode="TransportWithMessageCredential"  >  
           <message  clientCredentialType="UserName"
               establishSecurityContext="false"
               negotiateServiceCredential="false" />  
           <transport clientCredentialType="Certificate"  />  
         </security>  
    </binding>  
</wsHttpBinding>  

Se även