Vlastní zabezpečený koncový bod metadat

Ukázka CustomMexEndpoint ukazuje, jak implementovat službu s koncovým bodem zabezpečených metadat, který používá jednu z vazeb výměny metadat, a jak nakonfigurovat nástroj ServiceModel Metadata Utility Tool (Svcutil.exe) nebo klienty, aby načítá metadata z takového koncového bodu metadat. K dispozici jsou dvě systémové vazby pro zveřejnění koncových bodů metadat: mexHttpBinding a mexHttpsBinding. mexHttpBinding se používá k zveřejnění koncového bodu metadat přes protokol HTTP nezabezpečeně. mexHttpsBinding se používá k zabezpečenému zveřejnění koncového bodu metadat přes PROTOKOL HTTPS. Tato ukázka ukazuje, jak zveřejnit zabezpečený koncový bod metadat pomocí objektu WSHttpBinding. To byste chtěli udělat, když chcete změnit nastavení zabezpečení vazby, ale nechcete používat PROTOKOL HTTPS. Pokud použijete mexHttpsBinding, koncový bod metadat bude zabezpečený, ale neexistuje způsob, jak upravit nastavení vazby.

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

Služba

Služba v této ukázce má dva koncové body. Koncový bod aplikace slouží ICalculator ke smlouvě s povoleným a Message zabezpečením WSHttpBindingReliableSession pomocí certifikátů. Koncový bod metadat také používá WSHttpBinding, se stejným nastavením zabezpečení, ale bez .ReliableSession Tady je relevantní konfigurace:

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

V mnoha dalších ukázkách používá koncový bod metadat výchozí mexHttpBindinghodnotu, která není zabezpečená. Tady jsou metadata zabezpečená pomocí WSHttpBindingMessage zabezpečení. Aby klienti metadat mohli tato metadata načíst, musí být nakonfigurováni s odpovídající vazbou. Tato ukázka ukazuje dva takové klienty.

První klient používá Svcutil.exe k načtení metadat a generování kódu klienta a konfigurace v době návrhu. Vzhledem k tomu, že služba používá pro metadata ne výchozí vazbu, musí být nástroj Svcutil.exe speciálně nakonfigurovaný, aby mohl získat metadata ze služby pomocí této vazby.

Druhý klient používá MetadataResolver k dynamickému načtení metadat známého kontraktu a následné vyvolání operací s dynamicky vygenerovaným klientem.

Klient Svcutil

Při použití výchozí vazby k hostování koncového IMetadataExchange bodu můžete spustit Svcutil.exe s adresou tohoto koncového bodu:

svcutil http://localhost/servicemodelsamples/service.svc/mex

a funguje to. V této ukázce ale server používá k hostování metadat jiný než výchozí koncový bod. Proto Svcutil.exe musíme instruovat, aby používali správnou vazbu. Můžete to provést pomocí souboru Svcutil.exe.config.

Soubor Svcutil.exe.config vypadá jako normální konfigurační soubor klienta. Jediným neobvyklým aspektem je název a kontrakt koncového bodu klienta:

<endpoint name="http"
          binding="wsHttpBinding"
          bindingConfiguration="Binding1"
          behaviorConfiguration="ClientCertificateBehavior"
          contract="IMetadataExchange" />

Název koncového bodu musí být název schématu adresy, kde jsou metadata hostovaná a kontrakt koncového bodu musí být IMetadataExchange. Při spuštění Svcutil.exe pomocí příkazového řádku, jako je například následující:

svcutil http://localhost/servicemodelsamples/service.svc/mex

vyhledá koncový bod s názvem http a kontrakt IMetadataExchange , který nakonfiguruje vazbu a chování komunikace s koncovým bodem metadat. Zbytek souboru Svcutil.exe.config v ukázce určuje přihlašovací údaje konfigurace vazby a chování, které odpovídají konfiguraci serveru koncového bodu metadat.

Aby Svcutil.exe vyzvednout konfiguraci v souboru Svcutil.exe.config, musí být Svcutil.exe ve stejném adresáři jako konfigurační soubor. V důsledku toho je nutné zkopírovat Svcutil.exe z umístění instalace do adresáře, který obsahuje soubor Svcutil.exe.config. Pak z tohoto adresáře spusťte následující příkaz:

.\svcutil.exe http://localhost/servicemodelsamples/service.svc/mex

Úvodní ".\" zajišťuje, že se spustí kopie Svcutil.exe v tomto adresáři (ta, která má odpovídající Svcutil.exe.config).

Klient MetadataResolver

Pokud klient ví kontrakt a jak komunikovat s metadaty v době návrhu, klient může dynamicky zjistit vazbu a adresu koncových bodů aplikace pomocí MetadataResolver. Tento ukázkový klient ukazuje, jak nakonfigurovat vazbu a přihlašovací údaje používané MetadataResolver vytvořením a konfigurací MetadataExchangeClient.

Stejné informace o vazbě a certifikátu, které se objevily v souboru Svcutil.exe.config, je možné zadat imperativním MetadataExchangeClientzpůsobem na :

// 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");

S nakonfigurovaným mexClient nastavením můžeme vytvořit výčet kontraktů, které nás zajímají, a použít MetadataResolver k načtení seznamu koncových bodů s těmito kontrakty:

// 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);

Nakonec můžeme pomocí informací z těchto koncových bodů inicializovat vazbu a adresu použitého ChannelFactory k vytvoření kanálů pro komunikaci s koncovými body aplikace.

ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(endpoint.Binding, endpoint.Address);

Klíčovým bodem tohoto ukázkového klienta je předvedení, že pokud používáte MetadataResolver, a musíte zadat vlastní vazby nebo chování pro komunikaci výměny metadat, můžete použít MetadataExchangeClient k určení těchto vlastních nastavení.

Nastavení a sestavení ukázky

  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

  2. Pokud chcete sestavit řešení, postupujte podle pokynů v části Sestavení ukázek Windows Communication Foundation.

Spuštění ukázky na stejném počítači

  1. Spusťte Setup.bat z ukázkové instalační složky. Tím se nainstalují všechny certifikáty potřebné pro spuštění ukázky. Všimněte si, že Setup.bat používá nástroj FindPrivateKey.exe, který je nainstalován spuštěním setupCertTool.bat z jednorázového instalačního postupu pro ukázky Windows Communication Foundation.

  2. Spusťte klientskou aplikaci z \MetadataResolverClient\bin nebo \SvcutilClient\bin. Aktivita klienta se zobrazí v aplikaci konzoly klienta.

  3. Pokud klient a služba nemůžou komunikovat, přečtěte si téma Řešení potíží Tipy pro ukázky WCF.

  4. Po dokončení ukázky odeberte certifikáty spuštěním Cleanup.bat. Jiné ukázky zabezpečení používají stejné certifikáty.

Spuštění ukázky napříč počítači

  1. Na serveru spusťte setup.bat servicepříkaz . Spuštění setup.bat s argumentem service vytvoří certifikát služby s plně kvalifikovaným názvem domény počítače a exportuje certifikát služby do souboru s názvem Service.cer.

  2. Na serveru upravte web.config tak, aby odrážel nový název certifikátu. To znamená, že změňte findValue atribut v elementu <serviceCertificate> na plně kvalifikovaný název domény počítače.

  3. Zkopírujte soubor Service.cer z adresáře služby do klientského adresáře na klientském počítači.

  4. Na klientovi spusťte setup.bat clientpříkaz . Spuštění setup.bat s argumentem client vytvoří klientský certifikát s názvem Client.com a exportuje klientský certifikát do souboru s názvem Client.cer.

  5. V souboru App.config klientského MetadataResolverClient počítače změňte hodnotu adresy koncového bodu mex tak, aby odpovídala nové adrese vaší služby. Provedete to tak, že nahradíte localhost plně kvalifikovaným názvem domény serveru. Také změňte výskyt "localhost" v souboru metadataResolverClient.cs na nový název certifikátu služby (plně kvalifikovaný název domény serveru). Totéž udělejte pro App.config projektu SvcutilClient.

  6. Zkopírujte soubor Client.cer z klientského adresáře do adresáře služby na serveru.

  7. Na klientovi spusťte ImportServiceCert.batpříkaz . Tím se certifikát služby naimportuje ze souboru Service.cer do úložiště CurrentUser – Trusted Lidé.

  8. Na serveru spusťte ImportClientCert.batpříkaz , Tento importuje klientský certifikát ze souboru Client.cer do úložiště LocalMachine - Trusted Lidé.

  9. Na počítači služby sestavte projekt služby v sadě Visual Studio a ve webovém prohlížeči vyberte stránku nápovědy, abyste ověřili, že je spuštěná.

  10. Na klientském počítači spusťte z VS metadataResolverClient nebo SvcutilClient.

    1. Pokud klient a služba nemůžou komunikovat, přečtěte si téma Řešení potíží Tipy pro ukázky WCF.

Vyčištění po ukázce

  • Po dokončení spuštění ukázky spusťte Cleanup.bat ve složce s ukázkami.

    Poznámka:

    Tento skript při spuštění této ukázky na počítačích neodebere certifikáty služeb v klientovi. Pokud jste spustili ukázky wcf (Windows Communication Foundation), které používají certifikáty napříč počítači, nezapomeňte vymazat certifikáty služby nainstalované v úložišti CurrentUser – Trusted Lidé. K tomu použijte následující příkaz: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>. Například: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.