如何在SSL请求中获取请求IP地址

时间:2010-11-17 18:36:07

标签: c# ssl amazon-ec2

我有一个在Amazon Ec2中运行的服务。该服务公开了http端点和https端点。我在记录数据时正在对用户IP地址进行一些地理查找。在进入http端点的请求中,一切正常。我必须抓住X-Forwarded-For标头,这样我就不会使用Amazon Load Balancer UP地址,而且我总能得到我需要的东西。但是,对于进入https端点的请求,所有IP地址都是相同的。

为了提取IP地址,我使用以下C#代码:

    public static string FetchClientIp(HttpRequest req)
    {
        var value = req.Headers["X-Forwarded-For"];
        return string.IsNullOrEmpty(value) ? req.UserHostAddress : value;
    }

我找不到我需要做的任何其他特定于https请求的内容,所以我希望此处有人遇到此问题。我打算对此进行测试以试图更好地隔离问题。

由于

1 个答案:

答案 0 :(得分:0)

这取决于你如何设置ELB。

如果您在ELB(new feature as of October 2010)上终止SSL,则客户端IP地址将为“X-Forwarded-For”。

HttpContext.Current.Request.Headers["X-Forwarded-For"]

听起来您在Web服务器上终止SSL,然后ELB无法解密流量并将“X-Forwarded-For”标头添加到HTTP请求中。因此,标题“REMOTE_ADDR”(即HttpRequest.UserHostAddress返回的标头)中的客户端IP地址是最后一跳的IP - 在这种情况下是ELB的内部IP地址。

请注意,“X-Forwared-For”可能包含多个IP地址,如http://docs.amazonwebservices.com/ElasticLoadBalancing/latest/DeveloperGuide/index.html?SvcIntro.html#X-Forwarded-For所述。在这种情况下,您可能对列出的第一个地址最感兴趣。