在我发布之前,我已经阅读了多个问题(和答案),但我似乎无法以某种方式得到它... 如何使用REMOTE_ADDR计算IP范围? 例如,我已经给出了范围:197.168.178.1 - 197.168.178.10的exlusive访问权限 当我使用197.168.178.6访问该站点时,我希望获得访问权限。我该如何管理?
到目前为止我得到的是类IpRange的列表 - 这些IP地址在数据库中指定,可以更改为任何范围。该ID用于标识访问该站点的范围。
public class IpRange
{
public int ID { get; set; }
public System.Net.IPAddress RangeStart { get; set; }
public System.Net.IPAddress RangeEnd { get; set; }
}
我尝试使用下一种方法将传入的IP地址(Request.ServerVariables["REMOTE_ADDR"]
)与此范围匹配;
private static int MatchAddress(System.Net.IPAddress IP, List<IpRange> range)
{
int Value = -1;
foreach (IpRange item in range)
{
if (item.RangeStart.Address >= IP.Address && IP.Address <= item.RangeEnd.Address)
{
Value = item.ID;
break;
}
}
return Value;
}
方法地址已经过时,很可能会返回与我认为完全不同的东西;根据警告,我应该使用IPAddress.Equals
,但该方法只能比较两个地址,看它是否相同,我想知道它是否在范围内定义。
匹配此方法的方法是什么(或者我应该使用其他组件来执行此操作)?
P.S。我对网络的了解远低于标准,我知道,所以这可能是一个非常愚蠢的问题,但我迷失了。
答案 0 :(得分:1)
在这种情况下,您可以使用正则表达式。 sPattern是包含正则表达式的字符串,IP包含测试用例。以下是控制台应用程序的示例:
using System;
using System.Text.RegularExpressions;
namespace TestsApplication
{
class Program
{
static void Main(string[] args)
{
string sPattern = "197.168.178.([1-9]|10)$";
string[] IPs =
{
"197.168.178.1",
"197.168.178.10",
"197.168.178.5",
"197.168.178.255",
"255.255.255.0"
};
foreach (string s in IPs)
{
Console.Write("{0,24}", s);
if (Regex.IsMatch(s, sPattern, RegexOptions.IgnoreCase))
Console.WriteLine(" (match for '{0}' found)", sPattern);
else
Console.WriteLine(" No match!");
}
Console.ReadLine(); //Pause
}
}
}
答案 1 :(得分:1)
通常,您可以通过提供地址和掩码来定义带有范围的IP地址!可以根据第三个地址检查此元组,以确定它是否匹配:
IP Address: 192.168.178.1
Netmask: 255.255.255.16
Check addr: 192.168.178.9 -> falls into range.
Check addr: 192.168.238.3 -> doesn't fall into range.
这就是网络发生的方式。 ;)