Megosztás a következőn keresztül:


Egyéni biztonságos metaadatok végpontja

A CustomMexEndpoint-minta bemutatja, hogyan implementálhat egy olyan szolgáltatást egy biztonságos metaadat-végponttal, amely az egyik nem metaadat-exchange-kötést használja, és hogyan konfigurálhatja a ServiceModel Metadata Segédprogramot (Svcutil.exe) vagy az ügyfeleket, hogy lekérje a metaadatokat egy ilyen metaadat-végpontról. A metaadat-végpontok feltárására két rendszer által biztosított kötés érhető el: a mexHttpBinding és a mexHttpsBinding. A mexHttpBinding egy metaadat-végpont HTTP-en keresztüli, nem biztonságos módon történő elérhetővé tételére szolgál. A mexHttpsBinding használatával biztonságos módon tehet közzé metaadat-végpontot HTTPS-en keresztül. Ez a minta bemutatja, hogyan teheti elérhetővé a biztonságos metaadat-végpontot a WSHttpBinding. Ezt akkor érdemes megtennie, ha módosítani szeretné a kötés biztonsági beállításait, de nem szeretné a HTTPS-t használni. Ha a mexHttpsBinding metaadat-végpontot használja, biztonságos lesz, de nincs mód a kötési beállítások módosítására.

Feljegyzés

A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.

Szolgáltatás

A mintában szereplő szolgáltatás két végponttal rendelkezik. Az alkalmazásvégpont a szerződést WSHttpBindingReliableSession egy engedélyezett és Message biztonsági tanúsítvánnyal rendelkező szolgáltatással szolgálja ICalculator ki. A metaadat-végpont is ugyanazt a biztonsági beállítást használja WSHttpBinding, de nem ReliableSession. Íme a megfelelő konfiguráció:

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

Sok más mintában a metaadat-végpont az alapértelmezettet mexHttpBindinghasználja, amely nem biztonságos. Itt a metaadatok biztonsági védelemmel WSHttpBinding lesznek védve Message . Ahhoz, hogy a metaadat-ügyfelek lekérhessék ezeket a metaadatokat, konfigurálniuk kell őket egyező kötéssel. Ez a minta két ilyen ügyfelet mutat be.

Az első ügyfél a Svcutil.exe használja a metaadatok lekérésére, valamint ügyfélkód és konfiguráció generálására a tervezéskor. Mivel a szolgáltatás nem alapértelmezett kötést használ a metaadatokhoz, a Svcutil.exe eszközt kifejezetten úgy kell konfigurálni, hogy a metaadatokat le tudja szerezni a szolgáltatásból a kötés használatával.

A második ügyfél dinamikusan MetadataResolver lekéri egy ismert szerződés metaadatait, majd meghívja a dinamikusan létrehozott ügyfél műveleteit.

Svcutil-ügyfél

Amikor az alapértelmezett kötést használja a IMetadataExchange végpont üzemeltetéséhez, a végpont címével futtathat Svcutil.exe:

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

és működik. Ebben a példában azonban a kiszolgáló egy nem alapértelmezett végpontot használ a metaadatok üzemeltetéséhez. Ezért Svcutil.exe a megfelelő kötés használatára kell utasítani. Ez egy Svcutil.exe.config fájllal végezhető el.

A Svcutil.exe.config fájl normál ügyfélkonfigurációs fájlnak tűnik. Az egyetlen szokatlan szempont az ügyfélvégpont neve és szerződése:

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

A végpont nevének annak a címnek a sémájának a neve kell legyen, amelyben a metaadatok találhatók, és a végpontszerződésnek kell lennie IMetadataExchange. Így, ha Svcutil.exe fut egy parancssor, mint például a következő:

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

a "http" és a szerződés IMetadataExchange nevű végpontot keresi a metaadat-végponttal folytatott kommunikációs csere kötésének és viselkedésének konfigurálásához. A mintában található Svcutil.exe.config fájl többi része megadja a kötés konfigurációját és viselkedési hitelesítő adatait, hogy megfeleljenek a metaadat-végpont kiszolgálói konfigurációjának.

Ahhoz, hogy Svcutil.exe átvehesse a konfigurációt a Svcutil.exe.config fájlban, Svcutil.exe ugyanabban a könyvtárban kell lennie, mint a konfigurációs fájl. Ennek eredményeképpen át kell másolnia Svcutil.exe a telepítési helyről a Svcutil.exe.config fájlt tartalmazó könyvtárba. Ezután a könyvtárból futtassa a következő parancsot:

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

A kezdő ".\" biztosítja, hogy a könyvtárban (a megfelelő Svcutil.exe.config-ral rendelkező) Svcutil.exe példánya fusson.

MetadataResolver-ügyfél

Ha az ügyfél ismeri a szerződést, és hogyan beszélhet a metaadatokkal a tervezéskor, az ügyfél dinamikusan megtalálhatja az alkalmazásvégpontok kötését és címét a MetadataResolver. Ez a mintaügyfél ezt mutatja be, amely bemutatja, hogyan konfigurálhatja a kötést és a hitelesítő adatokat, amelyeket MetadataResolver egy MetadataExchangeClient.

A Svcutil.exe.config fájlban megjelenő kötési és tanúsítványinformációk a következő helyen MetadataExchangeClienthatározhatók meg:

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

A mexClient konfigurálással számba tudjuk adni azokat a szerződéseket, amelyek érdekelnek minket, és lekérhetjük MetadataResolver a végpontok listáját az alábbi szerződésekkel:

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

Végül a végpontok információi alapján inicializálhatjuk a csatornák létrehozásához használt kötést és címet ChannelFactory az alkalmazásvégpontokkal való kommunikációhoz.

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

Ennek a mintaügyfélnek a lényege annak bizonyítása, hogy ha használ MetadataResolver, és egyéni kötéseket vagy viselkedéseket kell megadnia a metaadatok közötti exchange-kommunikációhoz, az egyéni beállítások megadásához használhatja MetadataExchangeClient azokat.

A minta beállítása és létrehozása

  1. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták egyszeri beállítási eljárását.

  2. A megoldás létrehozásához kövesse a Windows Communication Foundation-minták készítésére vonatkozó utasításokat.

A minta futtatása ugyanazon a gépen

  1. Futtassa Setup.bat a minta telepítési mappából. Ez telepíti a minta futtatásához szükséges összes tanúsítványt. Vegye figyelembe, hogy Setup.bat az FindPrivateKey.exe eszközt használja, amely a Windows Communication Foundation-minták egyszeri beállítási eljárásából származó setupCertTool.bat futtatásával van telepítve.

  2. Futtassa az ügyfélalkalmazást a \MetadataResolverClient\bin vagy a \SvcutilClient\bin fájlból. Az ügyféltevékenység megjelenik az ügyfélkonzol-alkalmazásban.

  3. Ha az ügyfél és a szolgáltatás nem tud kommunikálni, olvassa el a WCF-minták hibaelhárítási Tippek című témakört.

  4. Távolítsa el a tanúsítványokat a Cleanup.bat futtatásával, ha befejezte a mintát. Más biztonsági minták ugyanazokat a tanúsítványokat használják.

A minta futtatása gépeken

  1. Futtassa setup.bat servicea kiszolgálón. Az argumentummal futtatva setup.batservice létrehoz egy szolgáltatástanúsítványt a gép teljes tartománynevével, és exportálja a szolgáltatástanúsítványt egy Service.cer nevű fájlba.

  2. A kiszolgálón szerkessze a Web.config fájlt az új tanúsítványnévnek megfelelően. Vagyis módosítsa a findValue serviceCertificate elem attribútumát>< a gép teljes tartománynevére.

  3. Másolja a Service.cer fájlt a szolgáltatáskönyvtárból az ügyfélszámítógép ügyfélkönyvtárába.

  4. Az ügyfélen futtassa a következőt setup.bat client: . Az argumentummal futtatva setup.batclient létrehoz egy Client.com nevű ügyféltanúsítványt, és exportálja az ügyféltanúsítványt egy Client.cer nevű fájlba.

  5. Az ügyfélszámítógép App.config fájljában MetadataResolverClient módosítsa a mex végpont címértékét úgy, hogy az megfeleljen a szolgáltatás új címének. Ezt úgy teheti meg, hogy lecseréli a localhostot a kiszolgáló teljes tartománynevére. Módosítsa a "localhost" előfordulását a metadataResolverClient.cs fájlban az új szolgáltatástanúsítvány nevére (a kiszolgáló teljes tartománynevére). Tegye ugyanezt az SvcutilClient-projekt App.config-jával.

  6. Másolja a Client.cer fájlt az ügyfélkönyvtárból a kiszolgáló szolgáltatáskönyvtárába.

  7. Az ügyfélen futtassa a következőt ImportServiceCert.bat: . Ez importálja a szolgáltatástanúsítványt a Service.cer fájlból a CurrentUser – Megbízható Kapcsolatok tárolóba.

  8. Futtassa ImportClientCert.bata kiszolgálón az ügyféltanúsítványt a Client.cer fájlból a LocalMachine – Megbízható Kapcsolatok tárolóba.

  9. A szolgáltatásgépen hozza létre a szolgáltatásprojektet a Visual Studióban, és válassza ki a böngésző súgólapját annak ellenőrzéséhez, hogy fut-e.

  10. Az ügyfélszámítógépen futtassa a MetadataResolverClient vagy az SvcutilClient fájlt a VS-ből.

    1. Ha az ügyfél és a szolgáltatás nem tud kommunikálni, olvassa el a WCF-minták hibaelhárítási Tippek című témakört.

A minta utáni tisztítás

  • A minta futtatása után futtassa a Cleanup.bat a mintamappában.

    Feljegyzés

    Ez a szkript nem távolítja el a szolgáltatástanúsítványokat az ügyfélen, amikor a mintát gépeken futtatja. Ha windowsos kommunikációs alap (WCF) mintákat futtat, amelyek tanúsítványokat használnak a gépeken, mindenképpen törölje a CurrentUser – Megbízható Kapcsolatok tárolóban telepített szolgáltatástanúsítványokat. Ehhez használja a következő parancsot: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>. Például: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com