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

Posted

技术标签:

【中文标题】如何获取 WCF 远程端点的 IP 地址?【英文标题】:How to get the IP address of a WCF remote endpoint? 【发布时间】:2010-09-28 07:33:52 【问题描述】:

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

我猜它没有内置到 WCF 框架中的原因是 WCF 可以与非 TCP/IP 绑定一起工作,因此 IP 地址并不总是有意义的。

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

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

我在谷歌上搜索过这个问题,似乎很多人在没有找到合适的解决方案的情况下遇到了它(通常的答案是to rely on the message headers,但这意味着信任客户端提供其真实 IP 地址,这如果您出于安全原因想要记录 IP 地址,则不是一个选项)

【问题讨论】:

【参考方案1】:

显然它已通过RemoteEndpointMessageProperty添加到3.5中;见here。

【讨论】:

帖子说这可以被欺骗,但我不知道他们是否在谈论经典的 IP 欺骗(使用 syn/acks)或者他们是否意味着信息是由远程 wcf 应用程序提供的.我认为是前者,因为我们得到的地址是代理/中继地址。有什么提示吗? 该示例生成 IPv6 格式的 IP - 有人知道如何将其转换为 IPv4 地址吗? @Luke See this question【参考方案2】:
OperationContext context = OperationContext.Current;
MessageProperties properties = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string address = endpoint.Address;

【讨论】:

这个例子是最适合我的例子。谢谢。【参考方案3】:

如果您在服务端并且想要获取客户端 IP,则必须检查 OperationContext 的消息属性。 例如看here 或 here

【讨论】:

如果我没记错的话,这意味着信任客户端(请参阅第一个链接帖子的末尾:“我们不进行任何类型的欺骗检测,所以在使用 IP 时要小心任何形式的安全决策。”)我宁愿访问我自己的套接字并检索它所连接的 IP 地址。

以上是关于如何获取 WCF 远程端点的 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 boost::asio::ip::tcp::socket 的 IP 地址?

WCF:如何从 ServiceHost 获取端点列表?

ASP.NET Core:如何获取远程 IP 地址?

使用 boost::asio 获取广播源 IP 地址

如何使用 express 框架通过 node.js 获取远程客户端的本地 IP 地址?

如何在 Java 中使用 RESTful Web 服务获取远程/客户端 IP 地址?