Endpoint di metadati protetto personalizzatoCustom Secure Metadata Endpoint

Questo esempio viene illustrato come implementare un servizio con un endpoint di metadati protetto che utilizza una delle associazioni non-metadata exchange e come configurare strumento ServiceModel Metadata Utility Tool (Svcutil.exe) o ai client di recuperare il metadati da un endpoint di metadati.This sample demonstrates how to implement a service with a secure metadata endpoint that uses one of the non-metadata exchange bindings, and how to configure ServiceModel Metadata Utility Tool (Svcutil.exe) or clients to fetch the metadata from such a metadata endpoint. Per l'esposizione di endpoint di metadati sono disponibili due associazioni fornite dal sistema, cioè mexHttpBinding e mexHttpsBinding.There are two system-provided bindings available for exposing metadata endpoints: mexHttpBinding and mexHttpsBinding. L'associazione mexHttpBinding viene utilizzata per esporre un endpoint di metadati tramite HTTP in modo non protetto.mexHttpBinding is used to expose a metadata endpoint over HTTP in a non-secure manner. L'associazione mexHttpsBinding viene utilizzata per esporre un endpoint di metadati tramite HTTPS in modo protetto.mexHttpsBinding is used to expose a metadata endpoint over HTTPS in a secure manner. In questo esempio viene illustrato come esporre un endpoint di metadati protetto tramite WSHttpBinding.This sample illustrates how to expose a secure metadata endpoint using the WSHttpBinding. Procedere in questo modo quando si desidera modificare le impostazioni di sicurezza sull'associazione senza utilizzare HTTPS.You would want to do this when you want to change the security settings on the binding, but you do not want to use HTTPS. Se si utilizza mexHttpsBinding, l'endpoint di metadati sarà protetto, ma non sarà in alcun modo possibile modificare le impostazioni dell'associazione.If you use the mexHttpsBinding your metadata endpoint will be secure, but there is no way to modify the binding settings.

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.The setup procedure and build instructions for this sample are located at the end of this topic.

ServiceService

Il servizio di questo esempio è dotato di due endpoint.The service in this sample has two endpoints. L'endpoint dell'applicazione invia al contratto ICalculator un WSHttpBinding con la ReliableSession attivata e la sicurezza dei Message che utilizza certificati.The application endpoint serves the ICalculator contract on a WSHttpBinding with ReliableSession enabled and Message security using certificates. L'endpoint di metadati utilizza inoltre WSHttpBinding, con le stesse impostazioni di sicurezza ma senza ReliableSession.The metadata endpoint also uses WSHttpBinding, with the same security settings but with no ReliableSession. La configurazione pertinente è la seguente:Here is the relevant configuration:

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

In molti degli altri esempi, l'endpoint di metadati utilizza il mexHttpBinding predefinito, che non è protetto.In many of the other samples, the metadata endpoint uses the default mexHttpBinding, which is not secure. Qui i metadati sono protetti utilizzando WSHttpBinding con sicurezza dei Message.Here the metadata is secured using WSHttpBinding with Message security. Affinché i client di metadati possano recuperare questi metadati, è necessario che siano configurati con un'associazione corrispondente.In order for metadata clients to retrieve this metadata, they must be configured with a matching binding. Nell'esempio viene illustrato l'utilizzo di due di questi client.This sample demonstrates two such clients.

Il primo client utilizza Svcutil.exe per recuperare i metadati e generare il codice del client e la configurazione in fase di progettazione.The first client uses Svcutil.exe to fetch the metadata and generate client code and configuration at design time. Il servizio utilizza un'associazione non predefinita per i metadati, quindi lo strumento Svcutil.exe deve essere specificamente configurato in modo da ottenere i metadati dal servizio che utilizza quell'associazione.Because the service uses a non-default binding for the metadata, the Svcutil.exe tool must be specifically configured so that it can get the metadata from the service using that binding.

Il secondo client utilizza il MetadataResolver per recuperare dinamicamente i metadati per un contratto noto e richiamare quindi le operazioni sul client generato dinamicamente.The second client uses the MetadataResolver to dynamically fetch the metadata for a known contract and then invoke operations on the dynamically generated client.

Client SvcutilSvcutil client

Quando si utilizza l'associazione predefinita per ospitare l'endpoint IMetadataExchange, è possibile eseguire Svcutil.exe con l'indirizzo di quell'endpoint:When using the default binding to host your IMetadataExchange endpoint, you can run Svcutil.exe with the address of that endpoint:

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

e funziona.and it works. Ma in questo esempio, il server utilizza un endpoint non predefinito per ospitare i metadati.But in this sample, the server uses a non-default endpoint to host the metadata. È quindi necessario richiedere a Svcutil.exe di utilizzare l'associazione corretta.So Svcutil.exe must be instructed to use the correct binding. Questa operazione può essere eseguita utilizzando un file Svcutil.exe.config.This can be done using a Svcutil.exe.config file.

Il file Svcutil.exe.config sembra un file di configurazione client normale.The Svcutil.exe.config file looks like a normal client configuration file. Le uniche differenze sono il nome e il contratto dell'endpoint:The only unusual aspects are the client endpoint name and contract:

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

Il nome dell'endpoint deve essere il nome dello schema dell'indirizzo in cui vengono ospitati i metadati e il contratto dell'endpoint deve essere IMetadataExchange.The endpoint name must be the name of the scheme of the address where the metadata is hosted and the endpoint contract must be IMetadataExchange. In questo modo, quando viene eseguito Svcutil.exe con una riga di comando simile alla seguente:Thus, when Svcutil.exe is run with a command-line such as the following:

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

viene cercato l'endpoint denominato "http" e il contratto IMetadataExchange per configurare l'associazione e il comportamento dello scambio di comunicazione con l'endpoint di metadati.it looks for the endpoint named "http" and contract IMetadataExchange to configure the binding and behavior of the communication exchange with the metadata endpoint. Il resto del file Svcutil.exe.config nell'esempio specifica la configurazione di associazione e le credenziali del comportamento per fare corrispondere la configurazione del server all'endpoint di metadati.The rest of the Svcutil.exe.config file in the sample specifies the binding configuration and behavior credentials to match the server's configuration of the metadata endpoint.

Perché Svcutil.exe selezioni la configurazione in Svcutil.exe.config, Svcutil.exe deve trovarsi nella stessa directory del file di configurazione.In order for Svcutil.exe to pick up the configuration in Svcutil.exe.config, Svcutil.exe must be in the same directory as the configuration file. Di conseguenza, è necessario copiare Svcutil.exe dal percorso di installazione alla directory che contiene il file Svcutil.exe.config.As a result, you must copy Svcutil.exe from its install location to the directory that contains the Svcutil.exe.config file. Da tale directory, eseguire il comando seguente:Then from that directory, run the following command:

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

Il prefisso ". \"assicura che venga eseguita la copia di Svcutil.exe in questa directory (quello dotato di un svcutil.exe. config corrispondente).The leading ".\" ensures that the copy of Svcutil.exe in this directory (the one which has a corresponding Svcutil.exe.config) is run.

Client di MetadataResolverMetadataResolver client

Se il client conosce il contratto e come comunicare con i metadati in fase di progettazione, può scoprire dinamicamente l'associazione e indirizzo degli endpoint dell'applicazione utilizzando MetadataResolver.If the client knows the contract and how to talk to the metadata at design time, the client can dynamically find out the binding and address of application endpoints using the MetadataResolver. In questo esempio di client viene illustrata questa operazione, oltre a come configurare l'associazione e le credenziali utilizzate dal MetadataResolver creando e configurando un MetadataExchangeClient.This sample client demonstrates this, showing how to configure the binding and credentials used by MetadataResolver by creating and configuring a MetadataExchangeClient.

Le stesse informazioni sull'associazione e sul certificato visualizzate in Svcutil.exe.config possono essere specificate in modo imperativo nel MetadataExchangeClient:The same binding and certificate information that appeared in Svcutil.exe.config can be specified imperatively on the 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");  

Una volta configurato il mexClient, è possibile enumerare i contratti desiderati e utilizzare MetadataResolver per recuperare un elenco di endpoint con quei contratti:With the mexClient configured, we can enumerate the contracts we are interested in, and use MetadataResolver to fetch a list of endpoints with those contracts:

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

Infine, è possibile utilizzare le informazioni da quegli endpoint per inizializzare l'associazione e l'indirizzo di una ChannelFactory utilizzata per creare canali per comunicare con gli endpoint dell'applicazione.Finally we can use the information from those endpoints to initialize the binding and address of a ChannelFactory used to create channels to communicate with the application endpoints.

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

Il punto importante di questo esempio di client è di dimostrare che, se si utilizza MetadataResolver ed è necessario specificare associazioni o comportamenti personalizzati per la comunicazione di scambio di metadati, è possibile utilizzare un MetadataExchangeClient per specificare quelle impostazioni personalizzate.The key point of this sample client is to demonstrate that, if you are using MetadataResolver, and you must specify custom bindings or behaviors for the metadata exchange communication, you can use a MetadataExchangeClient to specify those custom settings.

Per impostare e compilare l'esempioTo set up and build the sample

  1. Assicurarsi di avere eseguito la procedura di installazione singola per gli esempi di Windows Communication Foundation.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Per compilare la soluzione, seguire le istruzioni in compilazione degli esempi di Windows Communication Foundation.To build the solution, follow the instructions in Building the Windows Communication Foundation Samples.

Per eseguire l'esempio sullo stesso computerTo run the sample on the same machine

  1. Eseguire Setup.bat dalla cartella di installazione dell'esempio.Run Setup.bat from the sample install folder. In questo modo vengono installati tutti i certificati necessari per l'esecuzione dell'esempio.This installs all the certificates required for running the sample. Si noti che Setup.bat utilizza lo strumento FindPrivateKey.exe, che viene installato tramite l'esecuzione setupCertTool.bat da procedura di installazione singola per gli esempi di Windows Communication Foundation.Note that Setup.bat uses the FindPrivateKey.exe tool, which is installed by running setupCertTool.bat from One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Eseguire l'applicazione client da \MetadataResolverClient\bin o \SvcutilClient\bin.Run the client application from \MetadataResolverClient\bin or \SvcutilClient\bin. L'attività del client viene visualizzata nella finestra dell'applicazione console.Client activity is displayed on the client console application.

  3. Se il client e il servizio non sono in grado di comunicare, vedere suggerimenti per la risoluzione dei problemi.If the client and service are not able to communicate, see Troubleshooting Tips.

  4. Rimuovere i certificati eseguendo Cleanup.bat una volta completato l'esempio.Remove the certificates by running Cleanup.bat when you have finished with the sample. Negli altri esempi relativi alla sicurezza vengono usati gli stessi certificati.Other security samples use the same certificates.

Per eseguire l'esempio tra più computerTo run the sample across machines

  1. Eseguire setup.bat service sul server.On the server, run setup.bat service. Esecuzione setup.bat con il service argomento crea un certificato di servizio con il nome di dominio completo del computer e il certificato di servizio viene esportato in un file denominato Service.cer.Running setup.bat with the service argument creates a service certificate with the fully-qualified domain name of the machine and exports the service certificate to a file named Service.cer.

  2. Modificare Web.config sul server per riflettere il nome del nuovo certificato,On the server, edit Web.config to reflect the new certificate name. Ossia la modifica di findValue attributo la <serviceCertificate > elemento sul nome di dominio completo del computer.That is, change the findValue attribute in the <serviceCertificate> element to the fully-qualified domain name of the machine.

  3. Copiare il file Service.cer dalla directory del servizio alla directory del client sul computer client.Copy the Service.cer file from the service directory to the client directory on the client machine.

  4. Eseguire setup.bat client sul client.On the client, run setup.bat client. Esecuzione setup.bat con il client argomento crea un certificato client denominato Client.com ed Esporta il certificato client in un file denominato Client.cer.Running setup.bat with the client argument creates a client certificate named Client.com and exports the client certificate to a file named Client.cer.

  5. Nel file App.config del MetadataResolverClient sul computer client, modificare il valore dell'indirizzo dell'endpoint mex in modo che corrisponda al nuovo indirizzo del servizio.In the App.config file of the MetadataResolverClient on the client machine, change the address value of the mex endpoint to match the new address of your service. Tale operazione viene eseguita sostituendo localhost con il nome di dominio completo del server.You do this by replacing localhost with the fully-qualified domain name of the server. Modificare inoltre l'occorrenza di "localhost" nel file metadataResolverClient.cs al nuovo nome del certificato del servizio (il nome di dominio completo del server).Also change the occurrence of "localhost" in the metadataResolverClient.cs file to the new service certificate name (the fully-qualified domain name of the server). Eseguire la stessa operazione per il file App.config del progetto SvcutilClient.Do the same thing for the App.config of the SvcutilClient project.

  6. Copiare il file Client.cer dalla directory del client nella directory del servizio sul server.Copy the Client.cer file from the client directory to the service directory on the server.

  7. Eseguire ImportServiceCert.bat sul client.On the client, run ImportServiceCert.bat. In questo modo viene importato il certificato del servizio dal file Service.cer nell'archivio CurrentUser - TrustedPeople.This imports the service certificate from the Service.cer file into the CurrentUser - TrustedPeople store.

  8. Eseguire ImportClientCert.bat sul server. In questo modo il certificato client viene importato dal file Client.cer nell'archivio LocalMachine - TrustedPeople.On the server, run ImportClientCert.bat, This imports the client certificate from the Client.cer file into the LocalMachine - TrustedPeople store.

  9. Compilare il progetto di servizio in Visual Studio sul computer server e selezionare la pagina della Guida in un browser Web per verificare che sia in esecuzione.On the service machine, build the service project in Visual Studio and select the help page in a web browser to verify that it is running.

  10. Eseguire MetadataResolverClient o SvcutilClient da VS sul computer client.On the client machine, run the MetadataResolverClient or the SvcutilClient from VS.

    1. Se il client e il servizio non sono in grado di comunicare, vedere suggerimenti per la risoluzione dei problemi.If the client and service are not able to communicate, see Troubleshooting Tips.

Per eseguire la pulizia dopo l'esempioTo clean up after the sample

  • Eseguire Cleanup.bat nella cartella degli esempi una volta completato l'esempio.Run Cleanup.bat in the samples folder once you have finished running the sample.

    Nota

    Questo script non rimuove i certificati del servizio su un client quando si esegue questo esempio tra più computer.This script does not remove service certificates on a client when running this sample across machines. Se sono stati eseguiti esempi di Windows Communication Foundation (WCF) che utilizzano certificati in più computer, assicurarsi di cancellare i certificati del servizio che sono stati installati nell'archivio CurrentUser - TrustedPeople.If you have run Windows Communication Foundation (WCF) samples that use certificates across machines, be sure to clear the service certificates that have been installed in the CurrentUser - TrustedPeople store. A tale scopo, utilizzare il comando seguente: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>.To do this, use the following command: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>. Ad esempio: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.For example: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your machine. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Extensibility\Metadata\CustomMexEndpoint

Vedere ancheSee Also