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:
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.
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
, Transport
of 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
- ClientCredentials
- ClientBase<TChannel>
- ClientCredentials
- HttpsGetEnabled
- HttpsGetUrl
- <Bindings>
- Hulpprogramma voor configuratie-editor (SvcConfigEditor.exe)
- Services beveiligen
- Toegang tot services met behulp van een WCF-client
- Procedure: Waarden voor clientreferenties opgeven
- Hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe)
- Procedure: Geef het clientreferentietype op