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 WSHttpBinding
ReliableSession
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 mexHttpBinding
haszná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 MetadataExchangeClient
hatá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
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.
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
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.
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.
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.
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
Futtassa
setup.bat service
a kiszolgálón. Az argumentummal futtatvasetup.bat
service
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.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.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.
Az ügyfélen futtassa a következőt
setup.bat client
: . Az argumentummal futtatvasetup.bat
client
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.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.Másolja a Client.cer fájlt az ügyfélkönyvtárból a kiszolgáló szolgáltatáskönyvtárába.
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.Futtassa
ImportClientCert.bat
a kiszolgálón az ügyféltanúsítványt a Client.cer fájlból a LocalMachine – Megbízható Kapcsolatok tárolóba.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.
Az ügyfélszámítógépen futtassa a MetadataResolverClient vagy az SvcutilClient fájlt a VS-ből.
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