Delen via


Clients beveiligen

In Windows Communication Foundation (WCF) bepaalt de service de beveiligingsvereisten voor clients. Dat wil gezegd, de service geeft aan welke beveiligingsmodus moet worden gebruikt en of de client een referentie moet opgeven. Het proces voor het beveiligen van een client is daarom eenvoudig: gebruik de metagegevens die zijn verkregen van de service (als deze is gepubliceerd) en bouw een client. De metagegevens geven aan hoe de client moet worden geconfigureerd. Als de service vereist dat de client een referentie opgeeft, moet u een referentie verkrijgen die voldoet aan de vereiste. In dit onderwerp wordt het proces nader besproken. Zie Services beveiligen voor meer informatie over het maken van een beveiligde service.

De service geeft beveiliging op

WCF-bindingen hebben standaard beveiligingsfuncties ingeschakeld. (De uitzondering is de BasicHttpBinding.) Als de service is gemaakt met WCF, is er dus een grotere kans dat de beveiliging wordt geïmplementeerd om verificatie, vertrouwelijkheid en integriteit te garanderen. In dat geval geven de metagegevens van de service aan wat nodig is om een beveiligd communicatiekanaal tot stand te brengen. Als de metagegevens van de service geen beveiligingsvereisten bevatten, is er geen manier om een beveiligingsschema op te leggen, zoals Secure Sockets Layer (SSL) via HTTP, op een service. Als de service echter vereist dat de client een referentie opgeeft, moet de clientontwikkelaar, implementeerer of beheerder de werkelijke referentie opgeven die de client gebruikt om zichzelf bij de service te verifiëren.

Metagegevens verkrijgen

Bij het maken van een client is de eerste stap het verkrijgen van de metagegevens voor de service waarmee de client communiceert. Dit kan op twee manieren worden gedaan. Als de service eerst een MEX-eindpunt (Metadata Exchange) publiceert of de metagegevens beschikbaar maakt via HTTP of HTTPS, kunt u de metagegevens downloaden met het hulpprogramma ServiceModel Metadata Utility (Svcutil.exe), waarmee zowel codebestanden voor een client als een configuratiebestand worden gegenereerd. (Zie voor meer informatie over het gebruik van het hulpprogramma Toegang tot services met behulp van een WCF-client.) Als de service geen MEX-eindpunt publiceert en de metagegevens ook niet beschikbaar maakt via HTTP of HTTPS, moet u contact opnemen met de maker van de service voor documentatie waarin de beveiligingsvereisten en de metagegevens worden beschreven.

Belangrijk

Het wordt aanbevolen dat de metagegevens afkomstig zijn van een vertrouwde bron en dat er niet mee wordt geknoeid. Metagegevens die worden opgehaald met behulp van het HTTP-protocol, worden in duidelijke tekst verzonden en kunnen worden gemanipuleerd. Als de service gebruikmaakt van de HttpsGetEnabled en HttpsGetUrl eigenschappen, gebruikt u de URL die de maker van de service heeft opgegeven om de gegevens te downloaden met behulp van het HTTPS-protocol.

Beveiliging valideren

Metagegevensbronnen kunnen worden onderverdeeld in twee algemene categorieën: vertrouwensbronnen en niet-vertrouwde bronnen. Als u een bron vertrouwt en de clientcode en andere metagegevens van het beveiligde MEX-eindpunt van die bron hebt gedownload, kunt u de client bouwen, deze met de juiste referenties opgeven en uitvoeren zonder andere problemen.

Als u er echter voor kiest om een client en metagegevens te downloaden van een bron waarvan u weinig weet, moet u de beveiligingsmaatregelen valideren die door de code worden gebruikt. U mag bijvoorbeeld niet alleen een klant maken die uw persoonlijke of financiële gegevens naar een service verzendt, tenzij de service vertrouwelijkheid en integriteit vereist (op zijn minst). U moet de eigenaar van de service vertrouwen voor zover u bereid bent om dergelijke informatie bekend te maken, omdat deze informatie zichtbaar is voor hen.

Controleer daarom, wanneer u code en metagegevens van een niet-vertrouwde bron gebruikt, de code en metagegevens om ervoor te zorgen dat deze voldoet aan het beveiligingsniveau dat u nodig hebt.

Een clientreferentie instellen

Het instellen van een clientreferentie op een client bestaat uit twee stappen:

  1. Bepaal het clientreferentietype dat de service nodig heeft. Dit wordt bereikt door een van de twee methoden. Als u eerst documentatie van de maker van de service hebt, moet deze het clientreferentietype (indien van toepassing) opgeven dat de service nodig heeft. Ten tweede, als u alleen een configuratiebestand hebt gegenereerd door het hulpprogramma Svcutil.exe, kunt u de afzonderlijke bindingen onderzoeken om te bepalen welk referentietype is vereist.

  2. Geef een werkelijke clientreferentie op. De werkelijke clientreferentie wordt een clientreferentiewaarde genoemd om deze te onderscheiden van het type. Als het clientreferentietype bijvoorbeeld een certificaat opgeeft, moet u een X.509-certificaat opgeven dat is uitgegeven door een certificeringsinstantie.

Het clientreferentietype bepalen

Als u het configuratiebestand hebt dat door het Svcutil.exe hulpprogramma is gegenereerd, controleert u de <sectie Bindingen> om te bepalen welk type clientreferentie is vereist. Binnen de sectie bevinden zich bindingselementen die de beveiligingsvereisten opgeven. Onderzoek met name het <beveiligingselement> van elke binding. Dit element bevat het mode kenmerk dat u kunt instellen op een van de drie mogelijke waarden (Message, Transportof TransportWithMessageCredential). De waarde van het kenmerk bepaalt de modus en de modus bepaalt welke onderliggende elementen significant zijn.

Het <security> element kan een of een <transport> element of <message> beide bevatten. Het belangrijke element is het element dat overeenkomt met de beveiligingsmodus. De volgende code geeft bijvoorbeeld aan dat de beveiligingsmodus is "Message"en het clientreferentietype voor het <message> element is "Certificate". In dit geval kan het <transport> element worden genegeerd. Het <message> element geeft echter aan dat een X.509-certificaat moet worden opgegeven.

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

Als het clientCredentialType kenmerk is ingesteld op "Windows", zoals wordt weergegeven in het volgende voorbeeld, hoeft u geen werkelijke referentiewaarde op te geven. Dit komt doordat de geïntegreerde Windows-beveiliging de werkelijke referentie (een Kerberos-token) levert van de persoon die de client uitvoert.

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

De waarde voor clientreferenties instellen

Als wordt vastgesteld dat de client een referentie moet opgeven, gebruikt u de juiste methode om de client te configureren. Als u bijvoorbeeld een clientcertificaat wilt instellen, gebruikt u de SetCertificate methode.

Een algemene vorm van referentie is het X.509-certificaat. U kunt de referentie op twee manieren opgeven:

  • Door deze te programmeren in uw clientcode (met behulp van de SetCertificate methode).

Door een <>gedragssectie van het configuratiebestand voor de client toe te voegen en het clientCredentials element te gebruiken (hieronder weergegeven).

<Een clientCredentials-waarde> instellen in code

Als u een <clientCredentials-waarde> in code wilt instellen, moet u toegang krijgen tot de ClientCredentials eigenschap van de ClientBase<TChannel> klasse. De eigenschap retourneert een ClientCredentials object dat toegang biedt tot verschillende referentietypen, zoals wordt weergegeven in de volgende tabel.

Eigenschap ClientCredential Beschrijving Opmerkingen
ClientCertificate Geeft als resultaat een X509CertificateInitiatorClientCredential Vertegenwoordigt een X.509-certificaat dat door de client wordt geleverd om zichzelf bij de service te verifiëren.
HttpDigest Geeft als resultaat een HttpDigestClientCredential Vertegenwoordigt een HTTP-digest-referentie. De referentie is een hash van de gebruikersnaam en het wachtwoord.
IssuedToken Geeft als resultaat een IssuedTokenClientCredential Vertegenwoordigt een aangepast beveiligingstoken dat is uitgegeven door een beveiligingstokenservice, die vaak wordt gebruikt in federatiescenario's.
Peer Geeft als resultaat een PeerCredential Vertegenwoordigt een Peer-referentie voor deelname aan een Peer Mesh in een Windows-domein.
ServiceCertificate Geeft als resultaat een X509CertificateRecipientClientCredential Vertegenwoordigt een X.509-certificaat dat door de service wordt geleverd in een out-of-band-onderhandeling.
UserName Geeft als resultaat een UserNamePasswordClientCredential Vertegenwoordigt een gebruikersnaam en wachtwoordpaar.
Windows Geeft als resultaat een WindowsClientCredential Vertegenwoordigt een Windows-clientreferentie (een Kerberos-referentie). De eigenschappen van de klasse zijn alleen-lezen.

<Een clientCredentials-waarde> instellen in configuratie

Referentiewaarden worden opgegeven met behulp van een eindpuntgedrag als onderliggende elementen van het element clientCredentials>.< Het gebruikte element is afhankelijk van het type clientreferentie. In het volgende voorbeeld ziet u bijvoorbeeld de configuratie voor het instellen van een X.509-certificaat met behulp van clientCertificate<<>.

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

Als u de clientreferenties in de configuratie wilt instellen, voegt u een <endpointBehaviors-element> toe aan het configuratiebestand. Daarnaast moet het toegevoegde gedragselement worden gekoppeld aan het eindpunt van de service met behulp van het behaviorConfiguration kenmerk van het eindpunt> van <het <clientelement>, zoals wordt weergegeven in het volgende voorbeeld. De waarde van het behaviorConfiguration kenmerk moet overeenkomen met de waarde van het gedragskenmerk 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>

Notitie

Sommige van de clientreferentiewaarden kunnen niet worden ingesteld met toepassingsconfiguratiebestanden, bijvoorbeeld gebruikersnaam en wachtwoord, of Windows-gebruikers- en wachtwoordwaarden. Dergelijke referentiewaarden kunnen alleen in code worden opgegeven.

Zie How to: Specify Client Credential Values (Clientreferentiewaarden opgeven) voor meer informatie over het instellen van de clientreferenties.

Notitie

ClientCredentialType wordt genegeerd wanneer SecurityMode deze is ingesteld op "TransportWithMessageCredential", zoals wordt weergegeven in de volgende voorbeeldconfiguratie.

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

Zie ook