Aangepaste bindingsbeveiliging
In dit voorbeeld ziet u hoe u beveiliging configureert met behulp van een aangepaste binding. Het laat zien hoe u een aangepaste binding gebruikt om beveiliging op berichtniveau mogelijk te maken in combinatie met een veilig transport. Dit is handig wanneer een veilig transport nodig is om de berichten tussen client en service te verzenden en tegelijkertijd moeten de berichten veilig zijn op het berichtniveau. Deze configuratie wordt niet ondersteund door door het systeem geleverde bindingen.
Dit voorbeeld bestaat uit een clientconsoleprogramma (EXE) en een serviceconsoleprogramma (EXE). De service implementeert een dubbelzijdig contract. Het contract wordt gedefinieerd door de ICalculatorDuplex
interface, die wiskundige bewerkingen weergeeft (optellen, aftrekken, vermenigvuldigen en delen). De ICalculatorDuplex
interface stelt de client in staat om wiskundige bewerkingen uit te voeren, waarbij een actief resultaat voor een sessie wordt berekend. Onafhankelijk kan de service resultaten retourneren op de ICalculatorDuplexCallback
interface. Voor een dubbelzijdig contract is een sessie vereist, omdat er een context tot stand moet worden gebracht om de set berichten te correleren die worden verzonden tussen de client en de service. Er wordt een aangepaste binding gedefinieerd die ondersteuning biedt voor dubbelzijdige communicatie en veilig is.
Notitie
De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.
De serviceconfiguratie definieert een aangepaste binding die ondersteuning biedt voor het volgende:
TCP-communicatie beveiligd met behulp van het TLS/SSL-protocol.
Windows-berichtbeveiliging.
De aangepaste bindingsconfiguratie maakt veilig transport mogelijk door tegelijkertijd de beveiliging op berichtniveau in te schakelen. De volgorde van bindingselementen is belangrijk bij het definiëren van een aangepaste binding, omdat elk een laag in de kanaalstack vertegenwoordigt (zie Aangepaste bindingen). De aangepaste binding wordt gedefinieerd in de service- en clientconfiguratiebestanden, zoals wordt weergegeven in de volgende voorbeeldconfiguratie.
<bindings>
<!-- Configure a custom binding. -->
<customBinding>
<binding name="Binding1">
<security authenticationMode="SecureConversation"
requireSecurityContextCancellation="true">
</security>
<textMessageEncoding messageVersion="Soap12WSAddressing10" writeEncoding="utf-8"/>
<sslStreamSecurity requireClientCertificate="false"/>
<tcpTransport/>
</binding>
</customBinding>
</bindings>
De aangepaste binding maakt gebruik van een servicecertificaat om de service op transportniveau te verifiëren en om de berichten tijdens de overdracht tussen client en service te beveiligen. Dit wordt bereikt door het sslStreamSecurity
bindingselement. Het certificaat van de service wordt geconfigureerd met behulp van een servicegedrag, zoals wordt weergegeven in de volgende voorbeeldconfiguratie.
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata />
<serviceDebug includeExceptionDetailInFaults="False" />
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
Daarnaast maakt de aangepaste binding gebruik van berichtbeveiliging met het Windows-referentietype. Dit is het standaardreferentietype. Dit wordt bereikt door het security
bindingselement. Zowel client als service worden geverifieerd met behulp van beveiliging op berichtniveau als het Kerberos-verificatiemechanisme beschikbaar is. Dit gebeurt als het voorbeeld wordt uitgevoerd in de Active Directory-omgeving. Als het Kerberos-verificatiemechanisme niet beschikbaar is, wordt NTLM-verificatie gebruikt. NTLM verifieert de client bij de service, maar verifieert de service niet voor de client. Het security
bindingselement is geconfigureerd voor gebruik SecureConversation
authenticationType
, wat resulteert in het maken van een beveiligingssessie op zowel de client als de service. Dit is vereist om het dubbelzijdige contract van de service te laten werken.
Wanneer u het voorbeeld uitvoert, worden de bewerkingsaanvragen en -antwoorden weergegeven in het consolevenster van de client. Druk op Enter in het clientvenster om de client af te sluiten.
Press <ENTER> to terminate client.
Result(100)
Result(50)
Result(882.5)
Result(441.25)
Equation(0 + 100 - 50 * 17.65 / 2 = 441.25)
Wanneer u het voorbeeld uitvoert, ziet u de berichten die naar de client zijn geretourneerd op de callback-interface die vanuit de service wordt verzonden. Elk tussenliggend resultaat wordt weergegeven, gevolgd door de volledige vergelijking na voltooiing van alle bewerkingen. Druk op Enter om de client af te sluiten.
Met het meegeleverde Setup.bat-bestand kunt u de client en server configureren met het relevante servicecertificaat om een gehoste toepassing uit te voeren waarvoor beveiliging op basis van certificaten is vereist. Dit batchbestand moet worden gewijzigd om te kunnen werken op computers of om te kunnen werken in een niet-gehost geval.
Hieronder vindt u een kort overzicht van de verschillende secties van de batchbestanden die van toepassing zijn op dit voorbeeld, zodat ze kunnen worden gewijzigd voor uitvoering in de juiste configuratie:
Het servercertificaat maken.
Met de volgende regels uit het bestand Setup.bat maakt u het servercertificaat dat moet worden gebruikt. De
%SERVER_NAME%
variabele geeft de servernaam op. Wijzig deze variabele om uw eigen servernaam op te geven. Met dit batchbestand wordt de servernaam standaard ingesteld op localhost.Het certificaat wordt opgeslagen in het CurrentUser-archief voor de web-gehoste services.
echo ************ echo Server cert setup starting echo %SERVER_NAME% echo ************ echo making server cert echo ************ makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
Het servercertificaat installeren in het vertrouwde certificaatarchief van de client.
Met de volgende regels in het bestand Setup.bat kopieert u het servercertificaat naar het archief vertrouwde personen van de client. Deze stap is vereist omdat certificaten die worden gegenereerd door Makecert.exe niet impliciet worden vertrouwd door het clientsysteem. Als u al een certificaat hebt dat is geroot in een vertrouwd basiscertificaat van een client, bijvoorbeeld een door Microsoft uitgegeven certificaat, is deze stap voor het invullen van het clientcertificaatarchief met het servercertificaat niet vereist.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
Notitie
Het Setup.bat batchbestand is ontworpen om te worden uitgevoerd vanaf een Visual Studio 2010-opdrachtprompt. Hiervoor moet de omgevingsvariabele MSSDK verwijzen naar de map waarin de SDK is geïnstalleerd. Deze omgevingsvariabele wordt automatisch ingesteld in een Visual Studio 2010-opdrachtprompt.
Het voorbeeld instellen, compileren en uitvoeren
Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.
Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.
Als u het voorbeeld wilt uitvoeren in een configuratie van één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.
Het voorbeeld uitvoeren op dezelfde computer
Open een opdrachtprompt voor ontwikkelaars voor Visual Studio met beheerdersbevoegdheden en voer Setup.bat uit vanuit de voorbeeldinstallatiemap. Hiermee worden alle certificaten geïnstalleerd die vereist zijn voor het uitvoeren van het voorbeeld.
Notitie
Het Setup.bat batchbestand is ontworpen om te worden uitgevoerd vanaf een Visual Studio-opdrachtprompt. De omgevingsvariabele PATH die in de Visual Studio-opdrachtprompt is ingesteld, verwijst naar de map met uitvoerbare bestanden die zijn vereist voor het Setup.bat script.
Start Service.exe vanuit \service\bin.
Start Client.exe vanuit \client\bin. Clientactiviteit wordt weergegeven in de clientconsoletoepassing.
Als de client en service niet kunnen communiceren, raadpleegt u Tips voor probleemoplossing voor WCF-voorbeelden.
Het voorbeeld uitvoeren op computers
Op de servicecomputer:
Maak een virtuele map met de naam servicemodelsamples op de servicecomputer.
Kopieer de serviceprogrammabestanden van \inetpub\wwwroot\servicemodelsamples naar de virtuele map op de servicecomputer. Zorg ervoor dat u de bestanden in de submap \bin kopieert.
Kopieer de Setup.bat en Cleanup.bat bestanden naar de servicecomputer.
Voer de volgende opdracht uit in een opdrachtprompt voor ontwikkelaars voor Visual Studio die is geopend met beheerdersbevoegdheden:
Setup.bat service
Hiermee maakt u het servicecertificaat met de onderwerpnaam die overeenkomt met de naam van de computer waarop het batchbestand is uitgevoerd.Notitie
Het Setup.bat batchbestand is ontworpen om te worden uitgevoerd vanaf een Visual Studio 2010-opdrachtprompt. Hiervoor moet de omgevingsvariabele van het pad verwijzen naar de map waarin de SDK is geïnstalleerd. Deze omgevingsvariabele wordt automatisch ingesteld in een Visual Studio 2010-opdrachtprompt.
Wijzig de <serviceCertificate> in het bestand Service.exe.config om de onderwerpnaam weer te geven van het certificaat dat in de vorige stap is gegenereerd.
Voer Service.exe uit vanaf een opdrachtprompt.
Op de clientcomputer:
Kopieer de clientprogrammabestanden uit de map \client\bin\ naar de clientcomputer. Kopieer ook het Cleanup.bat-bestand.
Voer Cleanup.bat uit om oude certificaten uit eerdere voorbeelden te verwijderen.
Exporteer het certificaat van de service door een opdrachtprompt voor ontwikkelaars voor Visual Studio te openen met beheerdersbevoegdheden en de volgende opdracht uit te voeren op de servicecomputer (vervang
%SERVER_NAME%
door de volledig gekwalificeerde naam van de computer waarop de service wordt uitgevoerd):certmgr -put -r LocalMachine -s My -c -n %SERVER_NAME% %SERVER_NAME%.cer
Kopieer %SERVER_NAME%.cer naar de clientcomputer (vervang %SERVER_NAME% door de volledig gekwalificeerde naam van de computer waarop de service wordt uitgevoerd).
Importeer het certificaat van de service door een opdrachtprompt voor Ontwikkelaars voor Visual Studio te openen met beheerdersbevoegdheden en de volgende opdracht uit te voeren op de clientcomputer (vervang %SERVER_NAME% door de volledig gekwalificeerde naam van de computer waarop de service wordt uitgevoerd):
certmgr.exe -add -c %SERVER_NAME%.cer -s -r CurrentUser TrustedPeople
Stappen c, d en e zijn niet nodig als het certificaat wordt uitgegeven door een vertrouwde verlener.
Wijzig het app.config-bestand van de client als volgt:
<client> <endpoint name="default" address="net.tcp://ReplaceThisWithServiceMachineName:8000/ServiceModelSamples/Service" binding="customBinding" bindingConfiguration="Binding1" contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex" behaviorConfiguration="CalculatorClientBehavior" /> </client>
Als de service wordt uitgevoerd onder een ander account dan het NetworkService- of LocalSystem-account in een domeinomgeving, moet u mogelijk de eindpuntidentiteit voor het service-eindpunt in het App.config-bestand van de client wijzigen om de juiste UPN of SPN in te stellen op basis van het account dat wordt gebruikt om de service uit te voeren. Zie het onderwerp Service-identiteit en verificatie voor meer informatie over eindpuntidentiteit.
Voer Client.exe uit vanaf een opdrachtprompt.
Opschonen na het voorbeeld
- Voer Cleanup.bat uit in de map met voorbeelden nadat u het voorbeeld hebt uitgevoerd.