Slutpunkt för anpassade säkra metadata
Exemplet CustomMexEndpoint visar hur du implementerar en tjänst med en säker metadataslutpunkt som använder en av exchange-bindningarna för icke-metadata och hur du konfigurerar ServiceModel Metadata Utility Tool (Svcutil.exe) eller klienter för att hämta metadata från en sådan metadataslutpunkt. Det finns två bindningar som tillhandahålls av systemet för att exponera metadataslutpunkter: mexHttpBinding och mexHttpsBinding. mexHttpBinding används för att exponera en metadataslutpunkt via HTTP på ett icke-säkert sätt. mexHttpsBinding används för att exponera en metadataslutpunkt via HTTPS på ett säkert sätt. Det här exemplet visar hur du exponerar en säker metadataslutpunkt med hjälp av WSHttpBinding. Du skulle vilja göra detta när du vill ändra säkerhetsinställningarna för bindningen, men du inte vill använda HTTPS. Om du använder mexHttpsBinding kommer metadataslutpunkten att vara säker, men det finns inget sätt att ändra bindningsinställningarna.
Kommentar
Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.
Tjänst
Tjänsten i det här exemplet har två slutpunkter. Programslutpunkten hanterar ICalculator
kontraktet på en WSHttpBinding
med ReliableSession
aktiverad och Message
säkerhet med hjälp av certifikat. Metadataslutpunkten använder WSHttpBinding
också , med samma säkerhetsinställningar men utan ReliableSession
. Här är den relevanta konfigurationen:
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<!-- use base address provided by host -->
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="Binding2"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
<endpoint address="mex"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
<binding name="Binding2">
<reliableSession inactivityTimeout="00:01:00" enabled="true" />
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
I många av de andra exemplen använder metadataslutpunkten standardvärdet mexHttpBinding
, som inte är säker. Här skyddas metadata med säkerhet WSHttpBinding
Message
. För att metadataklienter ska kunna hämta dessa metadata måste de konfigureras med en matchande bindning. Det här exemplet visar två sådana klienter.
Den första klienten använder Svcutil.exe för att hämta metadata och generera klientkod och konfiguration vid designtillfället. Eftersom tjänsten använder en icke-standardbindning för metadata måste Svcutil.exe verktyget konfigureras specifikt så att det kan hämta metadata från tjänsten med hjälp av bindningen.
Den andra klienten använder MetadataResolver
för att dynamiskt hämta metadata för ett känt kontrakt och sedan anropa åtgärder på den dynamiskt genererade klienten.
Svcutil-klient
När du använder standardbindningen som värd för slutpunkten IMetadataExchange
kan du köra Svcutil.exe med adressen för slutpunkten:
svcutil http://localhost/servicemodelsamples/service.svc/mex
och det fungerar. Men i det här exemplet använder servern en slutpunkt som inte är standard för att vara värd för metadata. Därför måste Svcutil.exe instrueras att använda rätt bindning. Detta kan göras med hjälp av en Svcutil.exe.config-fil.
Filen Svcutil.exe.config ser ut som en normal klientkonfigurationsfil. De enda ovanliga aspekterna är klientens slutpunktsnamn och kontrakt:
<endpoint name="http"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
behaviorConfiguration="ClientCertificateBehavior"
contract="IMetadataExchange" />
Slutpunktsnamnet måste vara namnet på schemat för den adress där metadata finns och slutpunktskontraktet måste vara IMetadataExchange
. När Svcutil.exe körs med en kommandorad, till exempel följande:
svcutil http://localhost/servicemodelsamples/service.svc/mex
den söker efter slutpunkten med namnet "http" och kontrakt IMetadataExchange
för att konfigurera bindningen och beteendet för kommunikationsutbytet med metadataslutpunkten. Resten av filen Svcutil.exe.config i exemplet anger autentiseringsuppgifterna för bindningskonfiguration och beteende för att matcha serverns konfiguration av metadataslutpunkten.
För att Svcutil.exe ska kunna hämta konfigurationen i Svcutil.exe.config måste Svcutil.exe finnas i samma katalog som konfigurationsfilen. Därför måste du kopiera Svcutil.exe från dess installationsplats till katalogen som innehåller filen Svcutil.exe.config. Kör sedan följande kommando från katalogen:
.\svcutil.exe http://localhost/servicemodelsamples/service.svc/mex
Den inledande ".\" ser till att kopian av Svcutil.exe i den här katalogen (den som har motsvarande Svcutil.exe.config) körs.
MetadataResolver-klient
Om klienten känner till kontraktet och hur man kommunicerar med metadata vid designtillfället kan klienten dynamiskt ta reda på bindningen och adressen för programslutpunkter med hjälp MetadataResolver
av . Den här exempelklienten visar detta och visar hur du konfigurerar bindningen och autentiseringsuppgifterna som används genom MetadataResolver
att skapa och konfigurera en MetadataExchangeClient
.
Samma bindnings- och certifikatinformation som visades i Svcutil.exe.config kan anges imperativt på MetadataExchangeClient
:
// Specify the Metadata Exchange binding and its security mode
WSHttpBinding mexBinding = new WSHttpBinding(SecurityMode.Message);
mexBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
// Create a MetadataExchangeClient for retrieving metadata, and set the // certificate details
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexBinding);
mexClient.SoapCredentials.ClientCertificate.SetCertificate( StoreLocation.CurrentUser, StoreName.My,
X509FindType.FindBySubjectName, "client.com");
mexClient.SoapCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
mexClient.SoapCredentials.ServiceCertificate.SetDefaultCertificate( StoreLocation.CurrentUser, StoreName.TrustedPeople,
X509FindType.FindBySubjectName, "localhost");
Med den mexClient
konfigurerade kan vi räkna upp de kontrakt som vi är intresserade av och använda MetadataResolver
för att hämta en lista över slutpunkter med dessa kontrakt:
// The contract we want to fetch metadata for
Collection<ContractDescription> contracts = new Collection<ContractDescription>();
ContractDescription contract = ContractDescription.GetContract(typeof(ICalculator));
contracts.Add(contract);
// Find endpoints for that contract
EndpointAddress mexAddress = new EndpointAddress(ConfigurationManager.AppSettings["mexAddress"]);
ServiceEndpointCollection endpoints = MetadataResolver.Resolve(contracts, mexAddress, mexClient);
Slutligen kan vi använda informationen från dessa slutpunkter för att initiera bindningen och adressen för en ChannelFactory
som används för att skapa kanaler för att kommunicera med programslutpunkterna.
ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(endpoint.Binding, endpoint.Address);
Huvudpunkten för den här exempelklienten är att visa att om du använder MetadataResolver
, och du måste ange anpassade bindningar eller beteenden för metadatautbyteskommunikationen, kan du använda en MetadataExchangeClient
för att ange de anpassade inställningarna.
Så här konfigurerar och skapar du exemplet
Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.
Skapa lösningen genom att följa anvisningarna i Skapa Windows Communication Foundation-exempel.
Så här kör du exemplet på samma dator
Kör Setup.bat från exempelinstallationsmappen. Detta installerar alla certifikat som krävs för att köra exemplet. Observera att Setup.bat använder verktyget FindPrivateKey.exe, som installeras genom att köra setupCertTool.bat från engångsinstallationsproceduren för Windows Communication Foundation-exempel.
Kör klientprogrammet från \MetadataResolverClient\bin eller \SvcutilClient\bin. Klientaktiviteten visas i klientkonsolprogrammet.
Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.
Ta bort certifikaten genom att köra Cleanup.bat när du är klar med exemplet. Andra säkerhetsexempel använder samma certifikat.
Så här kör du exemplet mellan datorer
Kör på servern
setup.bat service
. 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.På servern redigerar du Web.config för att återspegla det nya certifikatnamnet. Det vill: ändra
findValue
attributet i <serviceCertificate-elementet> till datorns fullständigt kvalificerade domännamn.Kopiera Service.cer-filen från tjänstkatalogen till klientkatalogen på klientdatorn.
Kör på klienten
setup.bat client
. När du körsetup.bat
medclient
argumentet skapas ett klientcertifikat med namnet Client.com och klientcertifikatet exporteras till en fil med namnet Client.cer.I filen
MetadataResolverClient
App.config på klientdatorn ändrar du adressvärdet för mex-slutpunkten så att den matchar den nya adressen för din tjänst. Det gör du genom att ersätta localhost med serverns fullständigt kvalificerade domännamn. Ändra även förekomsten av "localhost" i filen metadataResolverClient.cs till det nya tjänstcertifikatnamnet (serverns fullständigt kvalificerade domännamn). Gör samma sak för App.config för SvcutilClient-projektet.Kopiera Client.cer-filen från klientkatalogen till tjänstkatalogen på servern.
Kör på klienten
ImportServiceCert.bat
. Detta importerar tjänstcertifikatet från filen Service.cer till arkivet CurrentUser – Trusted Personer.Kör på servern
ImportClientCert.bat
och importerar klientcertifikatet från Client.cer-filen till arkivet LocalMachine – Trusted Personer.På tjänstdatorn skapar du tjänstprojektet i Visual Studio och väljer hjälpsidan i en webbläsare för att kontrollera att det körs.
På klientdatorn kör du MetadataResolverClient eller SvcutilClient från VS.
- 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. Gör detta genom att använda följande kommando:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
. Exempel:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com
.