如何在 .Net API 中获取请求头中的位置?

7 浏览
0 Comments

如何在 .Net API 中获取请求头中的位置?

请问在使用MVC 6时,如何获取客户端IP地址?Request.ServerVariables["REMOTE_ADDR"]无法使用。

0
0 Comments

如何在.NET API中的请求头中获取位置信息?

在项目的project.json中添加一个依赖项:

"Microsoft.AspNetCore.HttpOverrides": "2.2.0"

在Startup.cs的Configure()方法中添加以下代码:

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor |
    ForwardedHeaders.XForwardedProto
});  

当然,还需要引入以下命名空间:

using Microsoft.AspNetCore.HttpOverrides;

然后,可以通过以下代码来获取IP地址:

Request.HttpContext.Connection.RemoteIpAddress

在我的情况下,在VS中进行调试时,总是得到的是IpV6的localhost,但是在部署到IIS上时,总是得到的是远程IP。

一些有用的链接:

[How do I get client IP address in ASP.NET CORE?](https://stackoverflow.com/questions/28664686) 和 [RemoteIpAddress is always null](https://stackoverflow.com/questions/35441521?noredirect=1&lq=1)

`::1`可能是因为:

> IIS终止连接,然后转发到v.next web服务器Kestrel,所以连接到Web服务器确实来自localhost。([https://stackoverflow.com/a/35442401/5326387](https://stackoverflow.com/a/35442401/5326387))

编辑于2020年12月: 感谢[SolidSnake](https://stackoverflow.com/users/326904/solidsnake): 截至2020年12月,最新版本是2.2.0

编辑于2021年06月: 感谢[Hakan Fıstık](https://stackoverflow.com/users/4390133/hakan-f%C4%B1st%C4%B1k): 在.NET 5中,命名空间是Microsoft.AspNetCore.Builder

这是正确的答案,也在官方关于反向代理的文档中有记录: [learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?tabs=aspnetcore2x#why-use-a-reverse-proxy-server](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?tabs=aspnetcore2x#why-use-a-reverse-proxy-server)

需要指出的是,"app.UseForwardedHeaders..."需要在app.UseAuthentication();之前添加,如果使用了身份验证。

这在我本地托管的IIS和Azure上都完美地工作。

截至2020年12月,最新版本是2.2.0

在.NET 5中,命名空间是Microsoft.AspNetCore.Builder

什么都没有改变,UseForwardedHeaders()扩展方法和ForwardedHeadersOptions类始终在Microsoft.AspNetCore.Builder中,而ForwardedHeaders仍然在Microsoft.AspNetCore.HttpOverrides中。

这个解决方案在使用.NET (core) 6.0.6时对我完美地工作。

Connection.RemoteIpAddress是正确的;如果您使用内容分发网络或额外的反向代理层,您需要根据您的设置进一步配置UseForwardedHeaders() -- 参见官方文档中关于配置高级场景的链接。

0
0 Comments

如何在.Net API中的请求头中获取位置信息?

最近API进行了更新。虽然不确定更改时间,但根据Damien Edwards在12月底的一条推文,现在可以这样做:

var remoteIpAddress = request.HttpContext.Connection.RemoteIpAddress;

对于我来说,当我在IIS上发布网站并将其记录在文件中时,RemoteIpAddress始终为null

目前,这个API存在一个bug,导致返回值为nullgithub.com/aspnet/IISIntegration/issues/17

看起来这个问题在rc 2中已经修复了。

System.Net.IPAddress remoteIpAddress = this.Request.HttpContext.Connection.RemoteIpAddress;

即使在远程连接时,我始终得到127.0.0.1。

对我来说,这返回的是IPv6格式的"::1"。其他人是如何看到127.0.0.1的?

还有其他人得到了IIS服务器的本地IP地址吗?

看起来它似乎不能将localhost解析为IP地址。如果您使用127.0.0.1而不是localhost,它应该显示IP地址。

context.HttpContext.Connection.RemoteIpAddress.MapToIPv4();这将返回0.0.0.1。

这个答案是不正确的,它总是返回127.0.0.1。

提醒一下,它返回"::1"是因为您在本地运行,当在本地运行时,它总是返回这个值。

这是正确的属性,但如果您使用了任何类型的反向代理、负载均衡器或内容分发,请根据Johna的答案配置UseForwardedHeaders()。

0