[英]How can I restrict page access by IP address range?
我的網站中有一個密碼更改頁面,我想限制對 IP 范圍的訪問,例如 10.0.0.0 - 10.255.255.255(10/8 前綴)。
當用戶進入頁面時,它會檢查用戶是否在此 IP 范圍內。 如果用戶在范圍內,則顯示歡迎消息; 如果沒有,那么它會將用戶重定向到登錄頁面。
IP 地址從 0x00000000 到 0xFFFFFFFF。
因此,請檢查用戶 IP 是否介於 0A000000 和 0AFFFFFF(十六進制)之間。
更新:演示應用程序:
給定 IP 地址 abcd,您可以使用以下方法計算其值:
a*2^24 + b*2^16 + c*2^8 + d*2^1
或縮短為
a*16777216 + b*65536 + c*256 + d
或十六進制
a*0x1000000L + b*0x10000 + c*0x100 + d
下面的示例使用此方法來查找 IP 地址的值。 這通常包含在套接字實現中,但似乎已被 Microsoft (IPAdress.Address) 棄用。
using System;
using System.Net;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var ip_range_from = IPAddress.Parse("10.0.0.0");
Console.WriteLine("From IP {0}, long value {1}", ip_range_from, GetLongIP(ip_range_from));
var ip_range_to = IPAddress.Parse("10.255.255.255");
Console.WriteLine("To IP {0}, long value {1}", ip_range_to, GetLongIP(ip_range_to));
var ip_query_fail = IPAddress.Parse("159.4.1.1");
Console.WriteLine("ValidIP({0}) returned {1} ",
ip_query_fail,
ValidIP(ip_range_from, ip_range_to, ip_query_fail)
);
var ip_query_ok = IPAddress.Parse("10.17.110.12");
Console.WriteLine("ValidIP({0}) returned {1} ",
ip_query_ok,
ValidIP(ip_range_from, ip_range_to, ip_query_ok)
);
Console.Read(); // wait ;)
}
private static bool ValidIP(IPAddress From, IPAddress To, IPAddress IP)
{
var LongIP = GetLongIP(IP);
return (LongIP > GetLongIP(From) && LongIP < GetLongIP(To));
}
private static long GetLongIP(IPAddress IP)
{
var bytes = IP.GetAddressBytes();
long LongIP = bytes[0] * 0x1000000L +
bytes[1] * 0x10000 +
bytes[2] * 0x100 +
bytes[3];
return LongIP;
}
}
}
嘗試以某種方式使用Request.UserHostAdress
。 注意:為了可測試性,您可能希望解決直接從Request
對象獲取數據的問題。
如果您想直接在 ASP.NET 中執行此操作,您可以查看 HttpRequest 對象,該對象將包含 ASP.NET認為正在連接的用戶信息,但這對您來說可能不夠可靠。
您還可以在 IIS 級別限制訪問,但這必須針對完整路徑或網站,而不是單個文件。
您可以包含自定義 HttpModule,它將檢查每個請求的 IP,並決定是像自定義 403 一樣在頁面上發送用戶還是通過正常的響應流。
在此處閱讀如何創建 HttpModule 並將其包含到 Web 應用程序中。 並限制訪問檢查context_BeginRequest
HttpRequest.UserHostAddress屬性將響應重定向到請求之外的某個頁面。
我已經解決了使用Request.UserHostAddress
獲取用戶 IP 地址的問題,然后將其拆分(如果它以 10.45 開頭)。 這是我的 ip,歡迎使用,如果不是這樣,那就意味着這是從外面來的,那么再見他。
Request.UserHostAddress
會以字符串形式為您提供請求者的 IP 地址,因此您只需調用Request.UserHostAddress.StartsWith("10.")
。 但是,它不會告訴您他們是否在代理后面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.