Dela via


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 WSHttpBindingockså , 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 WSHttpBindingMessage . 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 MetadataResolverav . 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

  1. Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.

  2. Skapa lösningen genom att följa anvisningarna i Skapa Windows Communication Foundation-exempel.

Så här kör du exemplet på samma dator

  1. 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.

  2. Kör klientprogrammet från \MetadataResolverClient\bin eller \SvcutilClient\bin. Klientaktiviteten visas i klientkonsolprogrammet.

  3. Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.

  4. 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

  1. Kör på servern setup.bat service. När du service kör setup.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.

  2. 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.

  3. Kopiera Service.cer-filen från tjänstkatalogen till klientkatalogen på klientdatorn.

  4. Kör på klienten setup.bat client. När du kör setup.bat med client argumentet skapas ett klientcertifikat med namnet Client.com och klientcertifikatet exporteras till en fil med namnet Client.cer.

  5. 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.

  6. Kopiera Client.cer-filen från klientkatalogen till tjänstkatalogen på servern.

  7. Kör på klienten ImportServiceCert.bat. Detta importerar tjänstcertifikatet från filen Service.cer till arkivet CurrentUser – Trusted Personer.

  8. Kör på servern ImportClientCert.batoch importerar klientcertifikatet från Client.cer-filen till arkivet LocalMachine – Trusted Personer.

  9. 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.

  10. På klientdatorn kör du MetadataResolverClient eller SvcutilClient från VS.

    1. 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.