Autenticación del mensaje del canal del mismo nivel
Este ejemplo muestra cómo utilizar NetPeerTcpBinding que enlaza con autenticación basada en mensaje, que proporciona comunicación multipartidaria mediante el canal del mismo nivel. Este ejemplo es una variación de Ejemplo de introducción. Consulte Ejemplo de introducción para obtener una descripción general de Windows Communication Foundation (WCF).
En este ejemplo, la instancias de aplicación son aplicaciones de consola hospedadas por sí mismas.
A diferencia de otros ejemplos de enlace de transporte, este ejemplo utiliza la interfaz de contrato IQuoteChange
con el propósito de mostrar la comunicación entre varias personas. Todas las instancias implementan este contrato para recibir mensajes y crear servidores proxy del mismo contrato para enviar mensajes a la malla. Esto se muestra creando un canal dúplex a la malla.
Nota
Las instrucciones de compilación y el procedimiento de instalación de este ejemplo se encuentran al final de este tema.
Entender el proceso de configuración de enlace en el ejemplo implica los siguientes conceptos del canal del mismo nivel:
Una resolución del mismo nivel es responsable de resolver un id. de la malla en las direcciones del extremo de unos nodos en la malla.
Una malla es una colección con nombre de nodos del mismo nivel identificada por el id. de la malla.
Un nodo del mismo nivel es una instancia de una aplicación que participa en la malla.
Los id. de la malla identifican la parte del host de la dirección de un extremo en la malla. Los ejemplos de estas direcciones son "net.p2p://chatMesh/servicemodelsamples/chat" o "net.p2p://broadcastMesh/servicemodelsamples/announcements". chatMesh y broadcastMesh son los id. de la malla.
Todos los clientes que participan en una malla, utilizan el mismo id. de malla, aunque podrían utilizar rutas de acceso y servicios diferentes. Un mensaje enviado a una dirección de extremo concreta se entrega a todos los clientes que utilicen esa dirección.
Cuando se abre un nodo del mismo nivel, utiliza una resolución del mismo nivel para resolver el id. de la malla como una lista de direcciones de otros nodos del mismo nivel en la malla. Esto permite propagar los mensajes por toda la malla.
PeerTransportCredentialType especifica cómo los puntos de la malla se autentican unos con otros. Esta propiedad se puede especificar en la configuración de enlace, un objeto NetPeerTcpBinding o utilizando un elemento de enlace PeerTransportBindingElement. Se debe agregar una instancia de ClientCredentialSettings (o ServiceCredentialSettings) con credenciales adecuadas especificadas en la propiedad Peer a la colección de comportamientos en el generador de canales o host de servicio en función del uso.
El canal Peer admite los modos de autenticación siguientes en la clase PeerTransportCredentialType:
Password. Éste es el modo predeterminado de autenticación para el canal al mismo nivel. En este modo, se espera que todos los participantes en la malla demuestren que conocen una contraseña secreta. Esto se logra estableciendo una conexión segura entre los vecinos e intercambiando una transformación de esta contraseña. Cuando se especifica Password, la propiedad ClientCredentialSettings.Peer debe llevar una contraseña válida y opcionalmente una instancia de X509Certificate2 (con SetSelfCertificate).
Certificate. En este modo, la autenticación específica de la aplicación se realiza al establecer las conexiones del mismo nivel. Cuando se especifica este modo, las aplicaciones deben especificar una implementación concreta de X509Certificate2Validator en ClientCredentialSettings.Peer.PeerAuthentication que se agrega al generador de canales.
Las aplicaciones pueden firmar los mensajes salientes y validar los mensajes entrantes cuando la propiedad NetPeerTcpBinding.Security.Mode
esté establecida como SecurityMode.Message
o SecurityMode.TransportWithMessageCredential
.
La firma de los mensajes salientes utiliza una instancia de X509Certificate2
especificada con ClientCredentialSettings.Peer.SetSelfCertificate()
.
La firma del mensaje se realiza utilizando una instancia de X509Certificate2
. Para firmar los mensajes salientes (en caso de OutputChannel
de DuplexChannel
), la aplicación debe especificar la credencial para firmar con PeerCredential.SetSelfCertificate().
Para comprobar los mensajes entrantes (InputChannel
o DuplexChannel
), las aplicaciones deben especificar una implementación concreta de X509Certificate2Validator
que valida el origen de los mensajes y se especifica utilizando ServiceCredentialSettings.Peer.MessageSenderAuthentication()
.
El enlace se especifica en los archivos de configuración del remitente y los receptores. El tipo de enlace se especifica en el atributo binding
del elemento endpoint
tal y como se explica en el ejemplo.
<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>
Si utiliza el enlace NetPeerTcpBinding
con el comportamiento predeterminado, se habilita la seguridad basada en la contraseña. El elemento binding
proporciona los atributos para establecer el puerto, la dirección IP de escucha, el tipo de resolución, tamaño del mensaje máximo, tamaño del grupo de búferes máximo, cuotas del lector, modo de autenticación de los nodos del mismo nivel, autenticación de mensajes y tiempos de espera (para cerrar, abrir, enviar y recibir).
Nota
Este ejemplo utiliza la resolución predeterminada de mismo nivel (PNRP), que no está disponible en WCF. Por consiguiente, para ejecutar este ejemplo en WCF, debe utilizar una resolución de mismo nivel personalizada. Consulte Chat del canal del mismo nivel para obtener un ejemplo que utiliza una resolución de mismo nivel personalizada, por ejemplo.
<netPeerTcpBinding>
<binding configurationName="Binding1">
<resolver mode="Custom">
<customResolver type=
"MyAppNameSpace.MyCustomPeerResolver, myApp"/>
</resolver>
</binding>
</netPeerTcpBinding>
El archivo que contiene MyCustomPeerResolver
debe estar compilado con el remitente y los receptores. Tenga en cuenta que si el ejemplo se ejecuta en varios equipos con plataformas diferentes, deben usar la misma resolución.
Las implementaciones del receptor y el remitente también muestran cómo recuperar el nodo de mismo nivel asociado con el receptor o instancia del remitente y para registrar sus eventos en línea y sin conexión. Se inicia un evento en línea cuando el nodo del mismo nivel está conectado al menos a otro nodo del mismo nivel en la malla. Se inicia un evento sin conexión cuando un nodo del mismo nivel ya no está conectado a ningún otro nodo del mismo nivel en la malla.
En este momento, el canal del mismo nivel no se integra con la Service Model Metadata Utility Tool (Svcutil.exe). Por esta razón, Svcutil.exe no se puede utilizar para generar un canal con tipos para el remitente.
Al ejecutar el ejemplo, el remitente muestra un mensaje que indica que está listo para enviar los mensajes. Introduzca los valores seguidos por ENTRAR para enviar el valor estándar actual a los clientes del receptor. Las actualizaciones se muestran en las otras ventanas de la consola del cliente. Para finalizar el cliente, especifique un valor en blanco en las ventanas de la consola del remitente (o presione ENTRAR para un cliente del receptor).
Si habilita el seguimiento o el registro de mensajes, puede supervisar la actividad del remitente y del receptor en un nivel más profundo. El siguiente procedimientos describe cómo habilitar el seguimiento y el registro de los mensajes.
Nota
Es importante tener en cuenta que el ejemplo no administra actualmente todas las posibles excepciones que la infraestructura puede producir. Si está utilizando estos ejemplos en un entorno comercial/producción, siga los consejos recomendados para la gestión correcta de las excepciones.
Para configurar, generar y ejecutar el ejemplo
Asegúrese de que ha realizado Procedimiento de instalación único para ejemplos de Windows Communication Foundation.
Para generar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Generación de ejemplos de Windows Communication Foundation.
Para ejecutar el ejemplo en una configuración de equipos única, siga las instrucciones de Ejecución de ejemplos de Windows Communication Foundation.
Para instalar PNRP en Windows XP SP2 (instalación única):
En el Panel de control, haga doble clic en Agregar o quitar programas.
En el cuadro de diálogo Agregar o quitar programas, haga clic en Agregar o quitar componentes de Windows.
En el Asistente para componentes de Windows, seleccione la casilla Servicios de red y haga clic en Detalles.
Compruebe la casilla Punto a punto y haga clic en Aceptar.
Haga clic en Siguiente en el Asistente para componentes de Windows.
Cuando se haya completado la instalación haga clic en Finalizar.
En un símbolo de shell de sistema, inicie el servicio PNRP con el comando siguiente: net start pnrpsvc.
Siempre que el paso 3 se refiera al cliente y al servicio, esos pasos se aplicarán al remitente y al receptor.
Si ejecuta por primera vez este ejemplo, ejecute Setup.bat para crear y registrar los certificados utilizados por el ejemplo. Si varios equipos utilizan el ejemplo, ejecute sólo Setup.bat en un equipo y exporte el certificado generado a todos los otros equipos que vayan a utilizarlo. Esto se debe al hecho de que Setup.bat crea un certificado aleatorio, y así las diferentes ejecuciones de Setup.bat generan y registran un certificado único.
Inicie el receptor (o varios receptores) y el remitente. Cuando se conecten las instancias, especifique los valores en la consola de la aplicación del remitente para enviar las actualizaciones a los receptores. Todos los receptores reciben los mensajes de chat enviados por el remitente.
Ejecute Cleanup.bat para quitar los certificados creados por este ejemplo.
Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.