Anpassad bindningssäkerhet
Det här exemplet visar hur du konfigurerar säkerhet med hjälp av en anpassad bindning. Den visar hur du använder en anpassad bindning för att aktivera säkerhet på meddelandenivå tillsammans med en säker transport. Detta är användbart när en säker transport krävs för att överföra meddelandena mellan klienten och tjänsten och samtidigt måste meddelandena vara säkra på meddelandenivå. Den här konfigurationen stöds inte av bindningar som tillhandahålls av systemet.
Det här exemplet består av ett klientkonsolprogram (EXE) och ett tjänstkonsolprogram (EXE). Tjänsten implementerar ett duplex-kontrakt. Kontraktet definieras av ICalculatorDuplex
gränssnittet, som exponerar matematiska åtgärder (Lägg till, Subtrahera, Multiplicera och Dividera). Med ICalculatorDuplex
gränssnittet kan klienten utföra matematiska åtgärder och beräkna ett löpande resultat under en session. Oberoende av varandra kan tjänsten returnera resultat i ICalculatorDuplexCallback
gränssnittet. Ett duplex-kontrakt kräver en session, eftersom en kontext måste upprättas för att korrelera den uppsättning meddelanden som skickas mellan klienten och tjänsten. En anpassad bindning definieras som stöder dubbelsidig kommunikation och är säker.
Kommentar
Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.
Tjänstkonfigurationen definierar en anpassad bindning som stöder följande:
TCP-kommunikation som skyddas med hjälp av TLS/SSL-protokollet.
Windows-meddelandesäkerhet.
Den anpassade bindningskonfigurationen möjliggör säker transport genom att samtidigt aktivera säkerhet på meddelandenivå. Ordningen på bindningselement är viktig för att definiera en anpassad bindning, eftersom var och en representerar ett lager i kanalstacken (se Anpassade bindningar). Den anpassade bindningen definieras i tjänst- och klientkonfigurationsfilerna enligt följande exempelkonfiguration.
<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>
Den anpassade bindningen använder ett tjänstcertifikat för att autentisera tjänsten på transportnivå och för att skydda meddelandena under överföringen mellan klient och tjänst. Detta görs av bindningselementet sslStreamSecurity
. Tjänstens certifikat konfigureras med hjälp av ett tjänstbeteende enligt följande exempelkonfiguration.
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata />
<serviceDebug includeExceptionDetailInFaults="False" />
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
Dessutom använder den anpassade bindningen meddelandesäkerhet med windows-autentiseringstypen – det här är standardtypen för autentiseringsuppgifter. Detta görs av bindningselementet security
. Både klienten och tjänsten autentiseras med hjälp av säkerhet på meddelandenivå om Kerberos-autentiseringsmekanismen är tillgänglig. Detta inträffar om exemplet körs i Active Directory-miljön. Om Kerberos-autentiseringsmekanismen inte är tillgänglig används NTLM-autentisering. NTLM autentiserar klienten till tjänsten men autentiserar inte tjänsten till klienten. Bindningselementet security
är konfigurerat för att använda SecureConversation
authenticationType
, vilket resulterar i att en säkerhetssession skapas på både klienten och tjänsten. Detta krävs för att tjänstens duplex-kontrakt ska fungera.
När du kör exemplet visas åtgärdsbegäranden och svar i klientens konsolfönster. Tryck på RETUR i klientfönstret för att stänga av klienten.
Press <ENTER> to terminate client.
Result(100)
Result(50)
Result(882.5)
Result(441.25)
Equation(0 + 100 - 50 * 17.65 / 2 = 441.25)
När du kör exemplet visas de meddelanden som returneras till klienten i motringningsgränssnittet som skickas från tjänsten. Varje mellanliggande resultat visas, följt av hela ekvationen när alla åtgärder har slutförts. Tryck på RETUR för att stänga av klienten.
Med den medföljande Setup.bat-filen kan du konfigurera klienten och servern med relevant tjänstcertifikat för att köra ett värdbaserat program som kräver certifikatbaserad säkerhet. Den här batchfilen måste ändras för att fungera mellan datorer eller för att fungera i ett fall som inte är värdbaserat.
Följande ger en kort översikt över de olika avsnitten i batchfilerna som gäller för det här exemplet så att de kan ändras så att de körs i rätt konfiguration:
Skapa servercertifikatet.
Följande rader från Setup.bat-filen skapar det servercertifikat som ska användas. Variabeln
%SERVER_NAME%
anger servernamnet. Ändra den här variabeln för att ange ditt eget servernamn. Den här batchfilen standardservernamnet till localhost.Certifikatet lagras i CurrentUser-arkivet för de webbaserade tjänsterna.
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
Installera servercertifikatet i klientens betrodda certifikatarkiv.
Följande rader i Setup.bat-filen 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
Kommentar
Den Setup.bat batchfilen är utformad för att köras från en Kommandotolk i Visual Studio 2010. Det kräver att miljövariabeln MSSDK pekar på katalogen där SDK:et är installerat. Den här miljövariabeln anges automatiskt i en Visual Studio 2010-kommandotolk.
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.
Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.
Så här kör du exemplet på samma dator
Öppna en kommandotolk för utvecklare för Visual Studio med administratörsbehörighet och kör Setup.bat från exempelinstallationsmappen. 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 Visual Studio-kommandotolk. Variabeln PATH-miljö som angetts i Visual Studio-kommandotolken pekar på katalogen som innehåller körbara filer som krävs av Setup.bat skriptet.
Starta Service.exe från \service\bin.
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
På tjänstdatorn:
Skapa en virtuell katalog med namnet servicemodelsamples på tjänstdatorn.
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 Setup.bat- och Cleanup.bat-filerna till tjänstdatorn.
Kör följande kommando i en kommandotolk för utvecklare för Visual Studio som har öppnats med administratörsbehörighet:
Setup.bat service
. Då skapas tjänstcertifikatet med ämnesnamnet som matchar namnet på datorn som batchfilen kördes på.Kommentar
Den Setup.bat batchfilen är utformad för att köras från en Kommandotolk i Visual Studio 2010. 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 Visual Studio 2010-kommandotolk.
<Ändra serviceCertificate> i filen Service.exe.config så att det återspeglar certifikatets ämnesnamn som genererades i föregående steg.
Kör Service.exe från en kommandotolk.
På klientdatorn:
Kopiera klientprogramfilerna från mappen \client\bin\ till klientdatorn. Kopiera även Cleanup.bat-filen.
Kör Cleanup.bat för att ta bort alla gamla certifikat från tidigare exempel.
Exportera tjänstens certifikat genom att öppna en kommandotolk för utvecklare för Visual Studio med administratörsbehörighet och köra följande kommando på tjänstdatorn (ersätt
%SERVER_NAME%
med det fullständigt kvalificerade namnet på den dator där tjänsten körs):certmgr -put -r LocalMachine -s My -c -n %SERVER_NAME% %SERVER_NAME%.cer
Kopiera %SERVER_NAME%.cer till klientdatorn (ersätt %SERVER_NAME% med det fullständigt kvalificerade namnet på den dator där tjänsten körs).
Importera tjänstens certifikat genom att öppna en kommandotolk för utvecklare för Visual Studio med administratörsbehörighet och kör följande kommando på klientdatorn (ersätt %SERVER_NAME% med det fullständigt kvalificerade namnet på datorn där tjänsten körs):
certmgr.exe -add -c %SERVER_NAME%.cer -s -r CurrentUser TrustedPeople
Steg c, d och e är inte nödvändiga om certifikatet utfärdas av en betrodd utfärdare.
Ändra klientens App.config-fil enligt följande:
<client> <endpoint name="default" address="net.tcp://ReplaceThisWithServiceMachineName:8000/ServiceModelSamples/Service" binding="customBinding" bindingConfiguration="Binding1" contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex" behaviorConfiguration="CalculatorClientBehavior" /> </client>
Om tjänsten körs under ett annat konto än NetworkService- eller LocalSystem-kontot i en domänmiljö kan du behöva ändra slutpunktsidentiteten för tjänstslutpunkten i klientens App.config-fil för att ange lämpligt UPN eller SPN baserat på det konto som används för att köra tjänsten. Mer information om slutpunktsidentitet finns i avsnittet Tjänstidentitet och autentisering .
Kör Client.exe från en kommandotolk.
Rensa efter exemplet
- Kör Cleanup.bat i exempelmappen när du har kört exemplet.