110,502
社区成员
发帖
与我相关
我的任务
分享
#/Home/Index
public IActionResult Index() => Content(HttpContext.Connection.RemoteIpAddress.ToString());
public override void OnActionExecuting(ActionExecutingContext context)
{
//if ( !IPAddress.IsLoopback(context.HttpContext.Connection.RemoteIpAddress))
//{
var remoteIp = context.HttpContext.Connection.RemoteIpAddress;
Console.WriteLine("remoteIp:"+remoteIp);
var tmpForwardedIp = context.HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault();
Console.WriteLine("tmpForwardedIp:"+ tmpForwardedIp);
var tmpRealIp = context.HttpContext.Request.Headers["X-Real-IP"].FirstOrDefault();
Console.WriteLine("tmpRealIp:"+tmpRealIp);
var bytes = remoteIp.GetAddressBytes();
var badIp = true;
if (!string.IsNullOrEmpty(_whitelist))
{
string[] ip = _whitelist.Split(',');
foreach (var address in ip)
{
var testIp = IPAddress.Parse(address);
if (testIp.GetAddressBytes().SequenceEqual(bytes))
{
badIp = false;
break;
}
}
}
if (badIp)
{
context.Result = new StatusCodeResult(401);
return;
}
//}
base.OnActionExecuting(context);
}
我的服务器是CentOS7,当然这个关系不大,然后因为是临时测试用,所以没有装Nginx,直接用的 dotnet app.dll --urls=http://*:88
我在另外一台机器上通过IP:88来访问这个站点。
注意我在代码中,输出了3个不同的获取客户端IP地址的方式。只有第一个有输出,但是输出的是我这台服务器所在内网的网关地址,另外两个没有输出,是空值。
1 这里并没有获取到我本机ip,这个肯定是不对的,所以我不明白的是 dotnet app.dll --urls=http://*:88 到底做了什么,它的映射原理是什么。
2 另外两个没有输出,是当前上下文中根本就没有这2个属性的数据在httpHeader里。
最后,我的问题关键就是,这里为什么无法获取到我本机的ip,而是取到服务器的网关ip,这块让我非常不解。
还请各位大神踊跃发言~
谢谢