Obtener la dirección IP del cliente en WCF 3.0

82

Aparentemente, puede obtener fácilmente una dirección IP de cliente en WCF 3.5 pero no en WCF 3.0. Alguien sabe como?

Gaz
fuente

Respuestas:

152

Esto no le ayuda en 3.0, pero puedo ver que la gente encuentra esta pregunta y se siente frustrada porque están tratando de obtener la dirección IP del cliente en 3.5. Entonces, aquí hay un código que debería funcionar:

using System.ServiceModel;
using System.ServiceModel.Channels;

OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint =
    prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;
Paul Mrozowski
fuente
11
No pude editar la publicación, pero me ayudó muchísimo, ¡gracias! Quería mencionar que hay 2 errores. Debe ser "OperationContext" en lugar de "OperationContent" y debe ser "RemoteEndpointMessageProperty" en lugar de "RemoveEndpointMessageProperty".
Jeremy Mullin
3
Nota de seguridad: este valor puede ser falsificado ... ver MSDN
goodguys_activate
@ makerofthings7 Veo eso en MSDN, pero ¿podría realmente ser una falsificación? La solicitud todavía tiene un protocolo de enlace TCP. Si la IP fue realmente falsificada, ¿no se enviaría la sincronización al lugar equivocado y, por lo tanto, la conexión fallaría incluso antes de comenzar?
cuesta
1
@cost La "IP" en este caso no solo está en el paquete TCP, sino que también reside en el mensaje WCF; sin embargo, este texto en el flujo de datos (Capa 7) no está protegido correctamente '
goodguys_activate
1
@shambulator Han pasado varios años desde que vi el problema, pero el siguiente artículo de KB parece indicar que puede haber sido puertos, no direcciones IP. support.microsoft.com/kb/971842
goodguys_activate
36

Resulta que puede, siempre que (a) su servicio esté alojado en un servicio web (obviamente) y (b) habilite el modo AspNetCompatibility, de la siguiente manera:

    <system.serviceModel>
            <!-- this enables WCF services to access ASP.Net http context -->
            <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
...
    </system.serviceModel>

Y luego puede obtener la dirección IP mediante:

HttpContext.Current.Request.UserHostAddress
Gaz
fuente
11
Y luego lo obtienes usandoHttpContext.Current.Request.UserHostAddress
Jader Dias
3
Tenga en cuenta que esto
genera
15

Puede hacerlo si su objetivo es .NET 3.0 SP1.

OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint = prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;

Créditos: http://blogs.msdn.com/phenning/archive/2007/08/08/remoteendpointmessageproperty-in-wcf-net-3-5.aspx

Referencia: http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.remoteendpointmessageproperty.aspx


fuente
3
Ok, parece que estoy obteniendo un IPv6 como "fe80 :: 3dbc: a2ec". Estaba divagando, ¿cómo podría obtener el número de IP remoto
Junior Mayhé
@ makerofthings7 ¿qué debemos usar al tomar decisiones de seguridad?
CSharper