Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.
Anmärkning
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 sätter standarden för <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 -peVariabeln %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 standardinställningen localhost.Installera servercertifikatet i klientens betrodda certifikatarkiv
Följande rad kopierar serverns certifikat till lagringen för betrodda personer på klienten. 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 TrustedPeopleBevilja 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 iisresetAnmärkning
Om du använder en icke-amerikansk engelskspråkig version 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 One-Time installationsproceduren 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 öppnats med administratörsbehörighet. Detta installerar alla certifikat som krävs för att köra exemplet.
Anmärkning
Setup.bat-batchfilen är utformad för att köras från en utvecklarkommandotolk 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 Setup.bat, Cleanup.batoch ImportServiceCert.bat filer till klienten.
På servern kör du
setup.bat servicei en kommandotolk för utvecklare för Visual Studio som öppnats med administratörsbehörighet. Om du körsetup.batmed argumentetserviceskapas 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 den Client.exe.config filen på klientdatorn ändrar du slutpunktens adressvärde så att det matchar den nya adressen för din tjänst.
På klienten kör du ImportServiceCert.bat i en kommandotolk för utvecklare för Visual Studio som öppnats med administratörsbehörighet. Detta importerar tjänstcertifikatet från filen Service.cer till lagringsplatsen CurrentUser – TrustedPeople.
Starta Client.exe från en kommandoprompt på klientdatorn. Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.
Att städa upp efter provet
Kör Cleanup.bat i exempelmappen när du har kört exemplet.
Anmärkning
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, se till att rensa de tjänstcertifikat som har installerats i CurrentUser - TrustedPeople-arkivet. 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.