Användarnamn för meddelandesäkerhet
Det här exemplet visar hur du implementerar ett program som använder WS-Security med användarnamnsautentisering för klienten och kräver serverautentisering med hjälp av serverns X.509v3-certifikat. Alla programmeddelanden mellan klienten och servern är signerade och krypterade. Som standard används användarnamnet och lösenordet som tillhandahålls av klienten för att logga in på ett giltigt Windows-konto. Det här exemplet baseras på WSHttpBinding. Det här exemplet består av ett klientkonsolprogram (Client.exe) och ett tjänstbibliotek (Service.dll) som hanteras av Internet Information Services (IIS). Tjänsten implementerar ett kontrakt som definierar ett kommunikationsmönster för begäran-svar.
Kommentar
Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.
Det här exemplet visar också:
Standardmappning till Windows-konton så att ytterligare auktorisering kan utföras.
Så här kommer du åt anroparens identitetsinformation från tjänstkoden.
Tjänsten exponerar en enda slutpunkt för kommunikation med tjänsten, som definieras med hjälp av konfigurationsfilen Web.config. Slutpunkten består av en adress, en bindning och ett kontrakt. Bindningen konfigureras med en standard <wsHttpBinding>, som standard använder meddelandesäkerhet. Det här exemplet anger standard-wsHttpBinding ><för att använda autentisering med klientanvändarnamn. Beteendet anger att användarautentiseringsuppgifterna ska användas för tjänstautentisering. Servercertifikatet måste innehålla samma värde för ämnesnamnet som findValue
attributet i <serviceCredentials>.
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
<wsHttpBinding>
<!--
This configuration defines the security mode as Message and
the clientCredentialType as Username.
By default, Username authentication attempts to authenticate the provided
username as a Windows computer or domain account.
-->
<binding>
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
<serviceBehaviors>
<behavior>
<!--
The serviceCredentials behavior allows one to define a service certificate.
A service certificate is used by the service to authenticate itself to the client and to 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>
</system.serviceModel>
Klientslutpunktskonfigurationen består av en absolut adress för tjänstslutpunkten, bindningen och kontraktet. Klientbindningen konfigureras med lämplig securityMode
och authenticationMode
. När du kör i ett scenario mellan datorer måste tjänstslutpunktsadressen ändras i enlighet med detta.
<system.serviceModel>
<client>
<endpoint address="http://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
behaviorConfiguration="ClientCredentialsBehavior"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</client>
<bindings>
<wsHttpBinding>
<!--
This configuration defines the security mode as Message and
the clientCredentialType as Username.
-->
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
<endpointBehaviors>
<behavior name="ClientCredentialsBehavior">
<!--
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.
-->
<clientCredentials>
<serviceCertificate>
<authentication certificateValidationMode="PeerOrChainTrust" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Klientimplementeringen anger användarnamnet och lösenordet som ska användas.
// Create a client.
CalculatorClient client = new CalculatorClient();
// Configure client with valid computer or domain account (username,password).
client.ClientCredentials.UserName.UserName = username;
client.ClientCredentials.UserName.Password = password.ToString();
// Call GetCallerIdentity service operation.
Console.WriteLine(client.GetCallerIdentity());
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
När du kör exemplet visas åtgärdsbegäranden och svar i klientkonsolfönstret. Tryck på RETUR i klientfönstret för att stänga av klienten.
MyMachine\TestAccount
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.
Med Setup.bat batchfil som ingår i MessageSecurity-exemplen kan du konfigurera servern med ett relevant certifikat för att köra ett värdbaserat program som kräver certifikatbaserad säkerhet. Batchfilen kan köras i två lägen. Om du vill köra batchfilen i läget för en dator skriver du setup.bat
på kommandoraden. Om du vill köra den i tjänstläge skriver du setup.bat service
. Du använder det här läget när du kör exemplet mellan datorer. Mer information finns i installationsproceduren i slutet av det här avsnittet.
Följande ger en kort översikt över de olika avsnitten i batchfilerna.
Skapa servercertifikatet
Följande rader från Setup.bat batchfil skapar det servercertifikat som ska användas.
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
Variabeln %SERVER_NAME% anger servernamnet. Certifikatet lagras i LocalMachine-arkivet. Om den Setup.bat batchfilen körs med ett tjänstargument (till exempel
setup.bat service
) innehåller %SERVER_NAME% datorns fullständigt kvalificerade domännamn. Annars är den som standard localhost.Installera servercertifikatet i klientens betrodda certifikatarkiv
Följande rad kopierar servercertifikatet till det betrodda klientarkivet. Det här steget krävs eftersom certifikat som genereras av Makecert.exe inte är implicit betrodda av klientsystemet. Om du redan har ett certifikat som är rotat i ett klientbetrott rotcertifikat, till exempel ett Microsoft-utfärdat certifikat, krävs inte det här steget för att fylla i klientcertifikatarkivet med servercertifikatet.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
Bevilja behörigheter för certifikatets privata nyckel
Följande rader i Setup.bat batchfil gör servercertifikatet som lagras i LocalMachine-arkivet tillgängligt för ASP.NET arbetsprocesskontot.
echo ************ echo setting privileges on server certificates echo ************ for /F "delims=" %%i in ('"%ProgramFiles%\ServiceModelSampleTools\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE (ver | findstr /C:"5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R iisreset
Kommentar
Om du använder en icke-AMERIKANSK Den engelska versionen av Windows måste du redigera filen Setup.bat och ersätta
NT AUTHORITY\NETWORK SERVICE
kontonamnet med din regionala motsvarighet.
Så här konfigurerar du, skapar och kör exemplet
Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.
Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.
Så här kör du exemplet på samma dator
Kontrollera att sökvägen innehåller mappen där Makecert.exe och FindPrivateKey.exe finns.
Kör Setup.bat från exempelinstallationsmappen i en kommandotolk för utvecklare för Visual Studio som öppnas med administratörsbehörighet. Detta installerar alla certifikat som krävs för att köra exemplet.
Kommentar
Den Setup.bat batchfilen är utformad för att köras från en kommandotolk för utvecklare för Visual Studio. Det kräver att variabeln sökvägsmiljö pekar på katalogen där SDK:et är installerat. Den här miljövariabeln anges automatiskt i en kommandotolk för utvecklare för Visual Studio.
Kontrollera åtkomsten till tjänsten med hjälp av en webbläsare genom att ange adressen
http://localhost/servicemodelsamples/service.svc
.Starta Client.exe från \client\bin. Klientaktiviteten visas i klientkonsolprogrammet.
Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.
Så här kör du exemplet mellan datorer
Skapa en katalog på tjänstdatorn. Skapa ett virtuellt program med namnet servicemodelsamples för den här katalogen med hjälp av hanteringsverktyget för Internet Information Services.
Kopiera tjänstprogramfilerna från \inetpub\wwwroot\servicemodelsamples till den virtuella katalogen på tjänstdatorn. Se till att du kopierar filerna i underkatalogen \bin. Kopiera även Setup.bat- och Cleanup.bat-filerna till tjänstdatorn.
Skapa en katalog på klientdatorn för klient binärfilerna.
Kopiera klientprogramfilerna till klientkatalogen på klientdatorn. Kopiera även filerna Setup.bat, Cleanup.bat och ImportServiceCert.bat till klienten.
På servern kör du
setup.bat service
i en kommandotolk för utvecklare för Visual Studio som öppnats med administratörsbehörighet. När duservice
körsetup.bat
med argumentet skapas ett tjänstcertifikat med datorns fullständigt kvalificerade domännamn och tjänstcertifikatet exporteras till en fil med namnet Service.cer.Redigera Web.config för att återspegla det nya certifikatnamnet (i attributet findValue i elementet serviceCertificate) som är samma som datorns fullständigt kvalificerade domännamn
.
Kopiera Service.cer-filen från tjänstkatalogen till klientkatalogen på klientdatorn.
I filen Client.exe.config på klientdatorn ändrar du slutpunktens adressvärde så att det matchar tjänstens nya adress.
På klienten kör du ImportServiceCert.bat i en kommandotolk för utvecklare för Visual Studio som öppnas med administratörsbehörighet. Detta importerar tjänstcertifikatet från filen Service.cer till arkivet CurrentUser – Trusted Personer.
Starta Client.exe från en kommandotolk på klientdatorn. Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.
Rensa efter exemplet
Kör Cleanup.bat i exempelmappen när du har kört exemplet.
Kommentar
Det här skriptet tar inte bort tjänstcertifikat på en klient när du kör det här exemplet på flera datorer. Om du har kört WCF-exempel (Windows Communication Foundation) som använder certifikat mellan datorer måste du rensa de tjänstcertifikat som har installerats i arkivet CurrentUser – Trusted Personer. Det gör du genom att använda följande kommando:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
Till exempel:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com
.