Voorbeeld van berichtbeveiliging
Het MessageSecurity-voorbeeld laat zien hoe u een toepassing implementeert die gebruikmaakt van de basicHttpBinding
en berichtbeveiliging. Dit voorbeeld is gebaseerd op de Aan de slag die een rekenmachineservice implementeert.
Notitie
De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.
De beveiligingsmodus van basicHttpBinding
kan worden ingesteld op de volgende waarden: Message
, Transport
, , TransportCredentialOnly
TransportWithMessageCredential
en None
. In het volgende voorbeeldservice-app.config-bestand geeft de eindpuntdefinitie de basicHttpBinding
bindingsconfiguratie met de naam Binding1
en verwijst deze naar een bindingsconfiguratie, zoals wordt weergegeven in de volgende voorbeeldconfiguratie:
<system.serviceModel>
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<!-- This endpoint is exposed at the base address provided by -->
<!-- host: http://localhost:8000/ServiceModelSamples/service.-->
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</service>
</services>
...
</system.serviceModel>
De bindingsconfiguratie stelt het mode
kenmerk van de <beveiliging Message
>in op en stelt het clientCredentialType
kenmerk van het< bericht>Certificate
in, zoals wordt weergegeven in de volgende voorbeeldconfiguratie:
<bindings>
<basicHttpBinding>
<!--
This configuration defines the SecurityMode as Message and
the clientCredentialType as Certificate.
-->
<binding name="Binding1" >
<security mode = "Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
Het certificaat dat door de service wordt gebruikt om zichzelf te verifiëren bij de client, wordt ingesteld in de sectie gedrag van het configuratiebestand onder het serviceCredentials
element. De validatiemodus die van toepassing is op het certificaat dat de client gebruikt om zichzelf bij de service te verifiëren, wordt ook ingesteld in de sectie Gedrag onder het clientCertificate
element.
<!--For debugging purposes, set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
<!--The serviceCredentials behavior allows one to define a -->
<!--service certificate. A service certificate is used by a -->
<!--client to authenticate the service and provide message -->
<!-- protection. This configuration references the "localhost"-->
<!--certificate installed during the setup instructions. -->
<serviceCredentials>
<serviceCertificate findValue="localhost"
storeLocation="LocalMachine"
storeName="My" x509FindType="FindBySubjectName" />
<clientCertificate>
<!-- Setting the certificateValidationMode to -->
<!-- PeerOrChainTrust means that if the certificate -->
<!--is in the user's Trusted People store, then it is -->
<!-- trusted without performing a validation of the -->
<!-- certificate's issuer chain. This setting is used -->
<!-- here for convenience so that the sample can be run -->
<!-- without having to have certificates issued by a -->
<!-- certification authority (CA). -->
<!-- This setting is less secure than the default, -->
<!-- ChainTrust. The security implications of this -->
<!-- setting should be carefully considered before using -->
<!-- PeerOrChainTrust in production code. -->
<authentication
certificateValidationMode="PeerOrChainTrust" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
Dezelfde bindings- en beveiligingsdetails worden opgegeven in het clientconfiguratiebestand.
De identiteit van de aanroeper wordt weergegeven in het consolevenster van de service met behulp van de volgende code:
Console.WriteLine("Called by {0}", ServiceSecurityContext.Current.PrimaryIdentity.Name);
Wanneer u het voorbeeld uitvoert, worden de bewerkingsaanvragen en -antwoorden weergegeven in het clientconsolevenster. Druk op Enter in het clientvenster om de client af te sluiten.
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.
Het voorbeeld instellen en bouwen
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.
Het voorbeeld uitvoeren op dezelfde computer
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 Windows SDK-opdrachtprompt. Hiervoor moet de omgevingsvariabele MSSDK verwijzen naar de map waarin de SDK is geïnstalleerd. Deze omgevingsvariabele wordt automatisch ingesteld in een Windows SDK-opdrachtprompt.
Voer de servicetoepassing uit vanuit \service\bin.
Voer de clienttoepassing uit 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.
Verwijder de certificaten door Cleanup.bat uit te voeren wanneer u klaar bent met het voorbeeld. Andere beveiligingsvoorbeelden gebruiken dezelfde certificaten.
Het voorbeeld uitvoeren op verschillende computers
Maak een map op de servicecomputer voor de binaire servicebestanden.
Kopieer de bestanden van het serviceprogramma naar de servicemap op de server. Kopieer ook de bestanden Setup.bat, Cleanup.bat en ImportClientCert.bat naar de server.
Maak een map op de clientcomputer voor de binaire clientbestanden.
Kopieer de clientprogrammabestanden naar de clientmap op de clientcomputer. Kopieer ook de bestanden Setup.bat, Cleanup.bat en ImportServiceCert.bat naar de client.
Voer op de server de opdracht uit
setup.bat service
. Als u hetservice
argument uitvoertsetup.bat
, maakt u een servicecertificaat met de volledig gekwalificeerde domeinnaam van de computer en exporteert u het servicecertificaat naar een bestand met de naam Service.cer.Bewerk Service.exe.config om de nieuwe certificaatnaam weer te geven (in het
findValue
kenmerk in het <element serviceCertificate> ) dat gelijk is aan de volledig gekwalificeerde domeinnaam van de computer. Wijzig ook de waarde van het basisadres om een volledig gekwalificeerde computernaam op te geven in plaats van localhost.
Kopieer het Service.cer-bestand van de servicemap naar de clientmap op de clientcomputer.
Voer op de client de opdracht uit
setup.bat client
. Als u het argument uitvoertsetup.bat
, maakt u een clientcertificaat met declient
naam client.com en exporteert u het clientcertificaat naar een bestand met de naam Client.cer.Wijzig in het bestand Client.exe.config op de clientcomputer de adreswaarde van het eindpunt zodat deze overeenkomt met het nieuwe adres van uw service. U doet dit door localhost te vervangen door de volledig gekwalificeerde domeinnaam van de server. Wijzig ook het
findValue
kenmerk van de <defaultCertificate> in de naam van het nieuwe servicecertificaat. Dit is de volledig gekwalificeerde domeinnaam van de server.Kopieer het Client.cer-bestand van de clientmap naar de servicemap op de server.
Voer op de client ImportServiceCert.bat uit. Hiermee importeert u het servicecertificaat uit het Service.cer-bestand in het CurrentUser - Trusted Mensen-archief.
Voer op de server ImportClientCert.bat uit. Hiermee importeert u het clientcertificaat uit het Client.cer-bestand in het archief LocalMachine - Trusted Mensen.
Voer op de servicecomputer Service.exe uit vanaf een opdrachtprompt.
Start op de clientcomputer Client.exe vanuit een opdrachtpromptvenster.
- Als de client en service niet kunnen communiceren, raadpleegt u Tips voor probleemoplossing voor WCF-voorbeelden.
Opschonen na het voorbeeld
Voer Cleanup.bat uit in de map met voorbeelden zodra u klaar bent met het uitvoeren van het voorbeeld.
Notitie
Dit script verwijdert geen servicecertificaten op een client bij het uitvoeren van dit voorbeeld op computers. Als u WCF-voorbeelden (Windows Communication Foundation) hebt uitgevoerd die gebruikmaken van certificaten op computers, moet u de servicecertificaten wissen die zijn geïnstalleerd in het CurrentUser - Trusted Mensen-archief. Gebruik hiervoor de volgende opdracht:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
bijvoorbeeld:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com