如何获取WCF远程终结点的IP地址?

25

有没有办法获取WCF连接的远程IP地址?

我想,它没有内置到WCF框架中的原因是WCF可以使用非TCP/IP绑定工作,所以IP地址并不总是有意义。

但是,对于所有广泛使用的绑定(就我所知:BasicHttp、DualHttp、WSHttp和NetTcp),该信息都是有意义的。

可能可以使用反射访问IP地址,但我宁愿找到一种记录方式而不是侵入框架类的方案。

我已经在问题上搜索过了,似乎很多人遇到了这个问题,但没有找到一个好的解决方案(通常的答案是依靠消息头,但这意味着信任客户端提供其真实IP地址,如果您出于安全原因要记录IP地址,则这不是一个选项)。

3个回答

15

这篇文章说这个可以被欺骗,但我无法确定他们是在谈论经典的IP欺骗(使用syn/ack),还是指远程wcf应用程序提供的信息。我认为更可能是前者,因为我们得到的地址是代理/中继地址。对此有什么提示吗? - Brann
这个例子生成了IPv6格式的IP地址 - 有人知道如何将其转换为IPv4地址吗? - user141682
@Luke 请查看此问题 - Wilfred Knievel

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

1
这个例子是我用过最好的。谢谢。 - Neil Weicher

2

如果您在服务端想要获取客户端IP,您需要检查OperationContext的Message Properties。请参考这里这里的示例。


如果我没有错的话,这意味着需要信任客户端(请参阅第一个链接帖子的结尾:“我们不进行任何欺骗检测,因此在使用IP做出任何安全决策时要小心。”) 我宁愿访问自己的套接字并检索连接的IP地址。 - Brann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接