2008-12-24 18 views
24

¿Hay alguna forma de obtener la dirección IP remota de una conexión WCF?¿Cómo obtener la dirección IP de un punto final remoto WCF?

Supongo que la razón por la cual no está incorporada en el marco WCF es que WCF puede trabajar con enlaces no TCP/IP, por lo que la dirección IP no siempre es significativa.

Sin embargo, la información tendría sentido para todas las vinculaciones ampliamente utilizadas (hasta donde yo sé: BasicHttp, DualHttp, WSHttp y NetTcp).

La dirección IP es probablemente accesible mediante la reflexión, pero prefiero encontrar una forma documentada de obtenerla en lugar de piratear las clases de framework.

He buscado en Google sobre el tema, y ​​parece que mucha gente se ha encontrado con él sin encontrar una solución decente (La respuesta habitual es to rely on the message headers, pero esto implica confiar en que el cliente proporcione su dirección IP real, que es no es una opción si desea registrar la dirección IP por razones de seguridad)

Respuesta

14

Aparentemente se ha agregado en 3.5 a través de RemoteEndpointMessageProperty; ver here.

+0

la publicación dice que esto puede ser falso, pero no puedo determinar si están hablando de falsificación de IP clásica (usando syn/acks) o si significan que la información proviene de la aplicación wcf remota. Creo que es más bien lo primero porque la dirección que recibimos es la dirección de proxy/retransmisión. ¿Alguna pista sobre esto? – Brann

+0

Lo siento, no, no. –

+0

El ejemplo produce la IP en formato IPv6: ¿alguien sabe cómo convertirla a una dirección IPv4? – user141682

2

Si está en el lado del servicio y desea obtener la IP del cliente, debe verificar las Propiedades del mensaje de OperationContext. mira here o h ere por ejemplo

+0

Si no estoy confundiendo, esto implica confiar en el cliente (véase el final del primer mensaje vinculado: "Nosotros no hacemos ningún tipo de detección de suplantación, por lo que tener cuidado con el uso de la IP para cualquier tipo de decisiones de seguridad. ") Prefiero acceder a mi propio socket y recuperar la dirección IP a la que está conectado. – Brann

3
OperationContext context = OperationContext.Current; 
MessageProperties properties = context.IncomingMessageProperties; 
RemoteEndpointMessageProperty endpoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; 
string address = endpoint.Address; 
+1

Este ejemplo es el que mejor funcionó para mí. Gracias. –

Cuestiones relacionadas