Berichtbeveiliging anoniem
In het voorbeeld Message Security Anonymous ziet u hoe u een WCF-toepassing (Windows Communication Foundation) implementeert die gebruikmaakt van beveiliging op berichtniveau zonder clientverificatie, maar waarvoor serververificatie is vereist met behulp van het X.509-certificaat van de server. Alle toepassingsberichten tussen de client en server worden ondertekend en versleuteld. Dit voorbeeld is gebaseerd op het WSHttpBinding-voorbeeld . Dit voorbeeld bestaat uit een clientconsoleprogramma (.exe) en een servicebibliotheek (.dll) die wordt gehost door IIS (Internet Information Services). De service implementeert een contract dat een communicatiepatroon aanvraagantwoord definieert.
Notitie
De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.
In dit voorbeeld wordt een nieuwe bewerking toegevoegd aan de rekenmachineinterface die retourneert True
als de client niet is geverifieerd.
public class CalculatorService : ICalculator
{
public bool IsCallerAnonymous()
{
// ServiceSecurityContext.IsAnonymous returns true if the caller is not authenticated.
return ServiceSecurityContext.Current.IsAnonymous;
}
...
}
De service maakt één eindpunt beschikbaar voor communicatie met de service, gedefinieerd met behulp van een configuratiebestand (Web.config). Het eindpunt bestaat uit een adres, een binding en een contract. De binding wordt geconfigureerd met een wsHttpBinding
binding. De standaardbeveiligingsmodus voor de wsHttpBinding
binding is Message
. Het clientCredentialType
kenmerk is ingesteld op None
.
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
<wsHttpBinding>
<!-- This configuration defines the security mode as Message and -->
<!-- the clientCredentialType as None. This mode provides -->
<!-- server authentication only using the service certificate. -->
<binding>
<security mode="Message">
<message clientCredentialType="None" />
</security>
</binding>
</wsHttpBinding>
</bindings>
...
</system.serviceModel>
De referenties die moeten worden gebruikt voor serviceverificatie, worden opgegeven in het <gedrag>. Het servercertificaat moet dezelfde waarde bevatten voor de SubjectName
waarde die is opgegeven voor het findValue
kenmerk, zoals wordt weergegeven in de volgende voorbeeldcode.
<behaviors>
<serviceBehaviors>
<behavior>
<!--
The serviceCredentials behavior allows you 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" />
</serviceCredentials>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
De configuratie van het clienteindpunt bestaat uit een absoluut adres voor het service-eindpunt, de binding en het contract. De clientbeveiligingsmodus voor de wsHttpBinding
binding is Message
. Het clientCredentialType
kenmerk is ingesteld op None
.
<system.serviceModel>
<client>
<endpoint name=""
address="http://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
behaviorConfiguration="ClientCredentialsBehavior"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</client>
<bindings>
<wsHttpBinding>
<!--This configuration defines the security mode as -->
<!--Message and the clientCredentialType as None. -->
<binding name="Binding1">
<security mode = "Message">
<message clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
...
</system.serviceModel>
Het voorbeeld stelt het in om het CertificateValidationMode certificaat van de service te PeerOrChainTrust verifiëren. Dit wordt gedaan in het app.config-bestand van de client in de behaviors
sectie. Dit betekent dat als het certificaat zich in het archief vertrouwde Mensen van de gebruiker bevindt, het wordt vertrouwd zonder een validatie uit te voeren van de certificaatverlenerketen. Deze instelling wordt hier voor het gemak gebruikt, zodat het voorbeeld kan worden uitgevoerd zonder certificaten te vereisen die zijn uitgegeven door een certificeringsinstantie (CA). Deze instelling is minder veilig dan de standaardinstelling, ChainTrust. De gevolgen voor de beveiliging van deze instelling moeten zorgvuldig worden overwogen voordat u deze in productiecode gebruikt PeerOrChainTrust
.
De client-implementatie voegt een aanroep toe aan de IsCallerAnonymous
methode en anders wijkt niet af van het WSHttpBinding-voorbeeld .
// Create a client with a client endpoint configuration.
CalculatorClient client = new CalculatorClient();
// Call the GetCallerIdentity operation.
Console.WriteLine("IsCallerAnonymous returned: {0}", client.IsCallerAnonymous());
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
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.
IsCallerAnonymous returned: True
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.
Met het Setup.bat batchbestand dat is opgenomen in het voorbeeld Message Security Anonymous, kunt u de server configureren met een relevant certificaat om een gehoste toepassing uit te voeren waarvoor beveiliging op basis van certificaten is vereist. Het batchbestand kan in twee modi worden uitgevoerd. Als u het batchbestand in de modus met één computer wilt uitvoeren, typt setup.bat
u op de opdrachtregel. Als u het wilt uitvoeren in de servicemodus, typt setup.bat service
u . Gebruik deze modus bij het uitvoeren van het voorbeeld op computers. Zie de installatieprocedure aan het einde van dit onderwerp voor meer informatie.
Hieronder vindt u een kort overzicht van de verschillende secties van de batchbestanden:
Het servercertificaat maken.
De volgende regels uit het Setup.bat batchbestand maken het servercertificaat dat moet worden gebruikt.
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
De variabele %SERVER_NAME% geeft de servernaam op. Het certificaat wordt opgeslagen in het LocalMachine-archief. Als het installatiebatchbestand wordt uitgevoerd met een argument van de service (zoals
setup.bat service
) bevat de %SERVER_NAME% de volledig gekwalificeerde domeinnaam van de computer. Anders wordt standaard localhost gebruikt.Het servercertificaat installeren in het vertrouwde certificaatarchief van de client.
Met de volgende regel wordt het servercertificaat gekopieerd 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
Machtigingen verlenen voor de persoonlijke sleutel van het certificaat.
De volgende regels in het Setup.bat batchbestand maken het servercertificaat dat is opgeslagen in het LocalMachine-archief toegankelijk voor het ASP.NET werkprocesaccount.
echo ************ echo setting privileges on server certificates echo ************ for /F "delims=" %%i in ('"%MSSDK%\bin\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE (ver | findstr "5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R iisreset
Notitie
Als u een niet-Amerikaanse gebruiker gebruikt In de Engelse versie van Windows moet u het Setup.bat bestand bewerken en de NT AUTHORITY\NETWORK SERVICE
accountnaam vervangen door uw regionale equivalent.
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.
Het voorbeeld uitvoeren op dezelfde computer
Zorg ervoor dat het pad de map bevat waarin Makecert.exe en FindPrivateKey.exe zich bevinden.
Voer Setup.bat uit vanuit de voorbeeldinstallatiemap in een opdrachtprompt voor Ontwikkelaars voor Visual Studio met beheerdersbevoegdheden. Hiermee worden alle certificaten geïnstalleerd die vereist zijn voor het uitvoeren van het voorbeeld.
Notitie
Het installatiebatchbestand is ontworpen om te worden uitgevoerd vanaf een opdrachtprompt voor ontwikkelaars voor Visual Studio. Hiervoor moet de omgevingsvariabele van het pad verwijzen naar de map waarin de SDK is geïnstalleerd. Deze omgevingsvariabele wordt automatisch ingesteld in een opdrachtprompt voor Ontwikkelaars voor Visual Studio.
Controleer de toegang tot de service met behulp van een browser door het adres
http://localhost/servicemodelsamples/service.svc
in te voeren.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
Maak een map op de servicecomputer. Maak een virtuele toepassing met de naam servicemodelsamples voor deze map met behulp van het iis-beheerprogramma (Internet Information Services).
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 ook de Setup.bat- en Cleanup.bat-bestanden naar de servicecomputer.
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
setup.bat service
op de server uit in een opdrachtprompt voor ontwikkelaars voor Visual Studio die is geopend met beheerdersbevoegdheden. 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 Web.config om de nieuwe certificaatnaam (in het
findValue
kenmerk in serviceCertificate <) weer te> geven. Dit is hetzelfde als de volledig gekwalificeerde domeinnaam van de computer.Kopieer het Service.cer-bestand van de servicemap naar de clientmap op de clientcomputer.
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.
Voer op de client ImportServiceCert.bat uit in een opdrachtprompt voor ontwikkelaars voor Visual Studio die is geopend met beheerdersbevoegdheden. Hiermee importeert u het servicecertificaat uit het Service.cer-bestand in het CurrentUser - Trusted Mensen-archief.
Start Client.exe vanaf een opdrachtprompt op de clientcomputer. 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 nadat u het voorbeeld hebt uitgevoerd.
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.