Autenticazione dei messaggi del canale peer

In questo esempio viene illustrato l'utilizzo dell'associazione NetPeerTcpBinding, con autenticazione basata su messaggi, che fornisce comunicazioni a più parti tramite il canale peer. Questo esempio è una variante di Esempio della guida introduttiva. Per una panoramica di Windows Communication Foundation (WCF), vedere Esempio della guida introduttiva.

In questo esempio le istanze dell'applicazione sono applicazioni console indipendenti.

A differenza di altri esempi di associazioni di trasporto, in questo esempio viene utilizzata l'interfaccia di contratto IQuoteChange per illustrare le comunicazioni a più parti. Tutte le istanze implementano questo contratto per ricevere messaggi e creare proxy dello stesso contratto per l'invio dei messaggi alla mesh. Questo processo viene illustrato creando un canale duplex nella mesh.

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine dell'argomento.

Per comprendere il processo di configurazione dell'associazione descritto nell'esempio è necessario conoscere i concetti del canale peer seguenti:

  • Il resolver del peer è responsabile della risoluzione di un ID di mesh negli indirizzi degli endpoint di alcuni nodi della mesh.
  • Una mesh è un insieme denominato di nodi del peer identificati dall'ID della mesh.
  • Un nodo del peer è un'istanza di un'applicazione che fa parte della mesh.
  • Gli ID di mesh identificano la parte dell'host dell'indirizzo di un endpoint nella mesh. Sono esempi di questi indirizzi "net.p2p://chatMesh/servicemodelsamples/chat" e "net.p2p://broadcastMesh/servicemodelsamples/announcements". chatMesh e broadcastMesh sono ID di mesh.
  • Tutti i client che fanno parte di una mesh utilizzano lo stesso ID di mesh, ma potrebbero utilizzare anche percorsi e servizi diversi. Un messaggio indirizzato a un indirizzo di un endpoint specifico viene recapitato a tutti i client con tale indirizzo.

Quando viene aperto un nodo del peer, esso utilizza un resolver del peer per risolvere un ID di mesh in una lista di indirizzi di altri nodi del peer nel mesh. In tal modo, è possibile la propagazione dei messaggi in tutta la rete mesh.

PeerTransportCredentialType specifica come vengono autenticati reciprocamente i peer della mesh. Questa proprietà può essere specificata nella configurazione dell'associazione, nell'oggetto NetPeerTcpBinding o utilizzando un elemento di associazione PeerTransportBindingElement. Un'istanza di ClientCredentialSettings o ServiceCredentialSettings con credenziali appropriate specificate nella proprietà Peer deve essere aggiunta all'insieme dei comportamenti nella channel factory o nell'host del servizio, a seconda dell'utilizzo.

Il canale peer supporta le modalità di autenticazione seguenti nella classe PeerTransportCredentialType:

  1. Password. Si tratta della modalità predefinita di autenticazione per il canale peer. In questa modalità, tutti i partecipanti della mesh devono provare di essere a conoscenza di una password segreta. Questa operazione viene eseguita stabilendo una connessione sicura tra elementi adiacenti e scambiando una trasformazione di questa password. Se è specificato Password, la proprietà ClientCredentialSettings.Peer deve disporre di una password valida e facoltativamente di un'istanza di X509Certificate2 con SetSelfCertificate.
  2. Certificate. In questa modalità, l'autenticazione specifica dell'applicazione viene eseguita quando si stabiliscono connessioni peer. Quando questa modalità viene specificata, le applicazioni devono specificare un'implementazione concreta di X509Certificate2Validator in ClientCredentialSettings.Peer.PeerAuthentication aggiunto alla channel factory.

Le applicazioni possono firmare messaggi in uscita e possono convalidare messaggi in arrivo quando la proprietà NetPeerTcpBinding.Security.Mode è impostata su SecurityMode.Message o SecurityMode.TransportWithMessageCredential.

La firma di messaggi in uscita utilizza un'istanza di X509Certificate2 specificata con ClientCredentialSettings.Peer.SetSelfCertificate().

La firma del messaggio viene eseguita utilizzando un'istanza di X509Certificate2. Per firmare messaggi in uscita (in caso di OutputChannel di DuplexChannel), l'applicazione deve specificare la credenziale da utilizzare con PeerCredential.SetSelfCertificate().

Per la verifica dei messaggi in arrivo (InputChannel o DuplexChannel), le applicazioni devono specificare un'implementazione concreta di X509Certificate2Validator che convalida l'origine dei messaggi ed è specificato utilizzando ServiceCredentialSettings.Peer.MessageSenderAuthentication().

L'associazione viene specificata nei file di configurazione per il mittente e il destinatario. Il tipo di associazione è specificato nell'attributo binding dell'elemento endpoint, come illustrato nell'esempio riportato di seguito.

<services>
    <service name="Microsoft.ServiceModel.Samples.BroadcastReceiver">
        <!-- use base address provided by the host -->
        <endpoint address="Stocks"
            binding="netPeerTcpBinding"
            bindingConfiguration="Binding1" 
            contract="Microsoft.ServiceModel.Samples.IQuoteChange" />
    </service>
</services>

Se si utilizza l'associazione NetPeerTcpBinding con il comportamento predefinito, viene abilitata la sicurezza basata sulla password. L'elemento dell'binding fornisce attributi per impostare la porta, l'indirizzo IP di ascolto, il tipo di resolver, la dimensione massima dei messaggi, la dimensione massima del pool di buffer, le quote dei lettori, la modalità di autenticazione dei nodi dei peer, l'autenticazione dei messaggi e i timeout di chiusura, apertura, invio e ricezione.

Nota

Questo esempio utilizza il resolver Peer predefinito (PNRP) che non è disponibile in WCF. Pertanto, per eseguire questo esempio in WCF, è necessario utilizzare un resolver Peer personalizzato. Per un esempio in cui viene utilizzato un resolver del peer personalizzato, vedere Chat del canale peer, ad esempio.

<netPeerTcpBinding>
    <binding configurationName="Binding1"> 
        <resolver mode="Custom">
            <customResolver type=
                  "MyAppNameSpace.MyCustomPeerResolver, myApp"/>
        </resolver>
    </binding>
</netPeerTcpBinding>

Il file contenente MyCustomPeerResolver deve essere compilato con mittente e destinatario. Si noti che se l'esempio viene eseguito in più computer con piattaforme diverse, è necessario che venga utilizzato lo stesso resolver.

L'implementazione con mittente e destinatario illustra, inoltre, come recuperare il nodo del peer associato all'istanza del destinatario o del mittente e come eseguire la registrazione per i relativi eventi in linea e non in linea. Un evento in linea viene generato quando il nodo Peer è connesso ad almeno un altro nodo Peer nella rete mesh. Un evento non in linea viene generato, invece, quando un nodo Peer non è più connesso ad altri nodi Peer nella rete mesh.

A questo punto, il canale del peer non è più integrato con Service Model Metadata Utility Tool (Svcutil.exe). Per questo motivo non è possibile utilizzare Svcutil.exe per generare un canale tipizzato per il mittente.

Quando si esegue l'esempio, il mittente visualizza un messaggio che indica che è pronto per inviare messaggi. Immettere valori seguiti da INVIO per inviare il valore predefinito corrente ai client del destinatario. Gli aggiornamenti verranno visualizzati nelle altre finestre della console client. Per terminare il client, immettere un valore vuoto nelle finestre della console del mittente (o preme INVIO per un client del destinatario).

Se si abilita l'analisi o la registrazione dei messaggi, è possibile controllare l'attività del mittente e del destinatario a un livello più profondo. Le procedure seguenti illustrano come abilitare l'analisi e la registrazione dei messaggi.

Nota

È importante notare che attualmente nell'esempio non vengono gestite tutte le eccezioni che possono essere generate dall'infrastruttura. Se si utilizzano questi esempi in un ambiente commerciale o di produzione, seguire le procedure consigliate per una corretta gestione delle eccezioni.

Per impostare, compilare ed eseguire l'esempio

  1. Assicurarsi di aver eseguito Procedura di installazione singola per gli esempi di Windows Communication Foundation.

  2. Per generare l'edizione Visual C# .NET o Visual Basic .NET della soluzione, seguire le istruzioni in Generazione degli esempi Windows Communication Foundation.

  3. Per eseguire l'esempio in un solo computer, seguire le istruzioni in Esecuzione degli esempi di Windows Communication Foundation.

  4. Per installare PNRP in Windows XP SP2 (installazione singola):

    1. Nel Pannello di controllo fare doppio clic su Installazione applicazioni.
    2. Nella finestra di dialogo Installazione applicazioni scegliere Installazione componenti di Windows.
    3. Nella Procedura guidata componenti di Windows, selezionare la casella Servizi di rete e fare clic su Dettagli.
    4. Selezionare la casella di controllo Peer-to-Peer e fare clic su OK.
    5. Nell'Aggiunta guidata componenti di Windows fare clic su Avanti.
    6. Scegliere Fine per completare l’installazione.
    7. Dal prompt della shell dei comandi avviare il servizio PNRP con il comando seguente: net start pnrpsvc.
  5. Qundo il passaggio 3 fa riferimento a client e servizi, i passaggi si applicano a mittente e destinatario.

  6. In caso si esegua l'esempio per la prima volta, eseguire Setup.bat per creare e registrare certificati utilizzati dall'esempio. Se l'esempio viene utilizzato su più computer, eseguire Setup.bat su un solo computer ed esportare il certificato generato su tutti gli altri computer utilizzati. Ciò è dovuto al fatto che Setup.bat crea un certificato casuale, quindi esecuzioni diverse di Setup.bat generano e registrano un certificato univoco.

  7. Avviare il destinatario (o più destinatari) e il mittente. Quando le istanze si connettono, immettere valori nella console dell'applicazione del mittente per inviare aggiornamenti al destinatario. Messaggi di chat inviati dal mittente vengono ricevuti da tutti i destinatari.

  8. Eseguire Cleanup.bat per rimuovere i certificati creati da questo esempio.

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.