Ta đã biết cách lấy địa chỉ IP của client bằng Request.HttpContext.Connection.RemoteIpAddress.
Nhưng nếu API của chúng ta đặt sau một proxy như Nginx hay IIS thì kết quả trả về lại là 127.0.0.1 hoặc ::1, do nó lấy địa chỉ của con proxy thay vì địa chỉ thực sự.
Địa chỉ đúng lúc này nằm trong request header với key là X-Forwarded-For.
Ta cần forward header này để API nhận diện được IP thực bằng cách thêm đoạn sau vào Startup.cs hoặc Program.cs (tuỳ theo style có tách riêng file Startup.cs hay không):
app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.All, //forward toàn bộ header, mặc định là None nên không forward cái gì cả ForwardLimit = null, // bỏ giới hạn mặc định chỉ forward 1 thằng duy nhất KnownNetworks = { new IPNetwork(IPAddress.Parse("192.168.1.0"), 24) // đây là dải IP trong mạng LAN, nếu thiếu khai báo này sẽ bị trả về IP của gateway (x.x.x.1) thay vì IP client } });
Ngoài ra, nếu dùng Nginx thì cần bổ sung 1 số directive khi làm việc với proxy_pass
location /api { proxy_pass http://192.168.1.x/; // đừng quên ký tự / cuối cùng, nếu không file js trả về sẽ bị set thuộc tính ContentType là text/html thay vì text/javascript proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; // forward IP ở đây nè proxy_set_header X-Forwarded-Proto $scheme; }