C# 使用c根据一系列值检查ip地址的最简单方法#
我们正在编写一个允许管理员阻止/允许ip地址范围的功能 用c#做这件事够容易吗 我想看看每个数字[这里][这里][这里][这里],然后把它与范围匹配,看看每个数字是否在两者之间 这对标准ip v4地址有效吗?C# 使用c根据一系列值检查ip地址的最简单方法#,c#,asp.net,ip,C#,Asp.net,Ip,我们正在编写一个允许管理员阻止/允许ip地址范围的功能 用c#做这件事够容易吗 我想看看每个数字[这里][这里][这里][这里],然后把它与范围匹配,看看每个数字是否在两者之间 这对标准ip v4地址有效吗?公共静态bool CheckIfIpValid(字符串allowedStartIp、字符串allowedEndIp、字符串ip) public static bool CheckIfIpValid(string allowedStartIp, string allowedEndIp, str
公共静态bool CheckIfIpValid(字符串allowedStartIp、字符串allowedEndIp、字符串ip)
public static bool CheckIfIpValid(string allowedStartIp, string allowedEndIp, string ip)
{
// if both start and end ip's are null, every user with these credential can log in, no ip restriction needed.
if (string.IsNullOrEmpty(allowedStartIp) && string.IsNullOrEmpty(allowedEndIp))
return true;
bool isStartNull = string.IsNullOrEmpty(allowedStartIp),
isEndNull = string.IsNullOrEmpty(allowedEndIp);
string[] startIpBlocks, endIpBlocks, userIp = ip.Split('.');
if (!string.IsNullOrEmpty(allowedStartIp))
startIpBlocks = allowedStartIp.Split('.');
else
startIpBlocks = "0.0.0.0".Split('.');
if (!string.IsNullOrEmpty(allowedEndIp))
endIpBlocks = allowedEndIp.Split('.');
else
endIpBlocks = "999.999.999.999".Split('.');
for (int i = 0; i < userIp.Length; i++)
{
// if current block is smaller than allowed minimum, ip is not valid.
if (Convert.ToInt32(userIp[i]) < Convert.ToInt32(startIpBlocks[i]))
return false;
// if current block is greater than allowed maximum, ip is not valid.
else if (Convert.ToInt32(userIp[i]) > Convert.ToInt32(endIpBlocks[i]))
return false;
// if current block is greater than allowed minimum, ip is valid.
else if ((Convert.ToInt32(userIp[i]) > Convert.ToInt32(startIpBlocks[i])) && !isStartNull)
return true;
}
return true;
}
{
//如果开始和结束ip都为空,则具有这些凭据的每个用户都可以登录,无需ip限制。
if(string.IsNullOrEmpty(allowedStartIp)和&string.IsNullOrEmpty(allowedEndIp))
返回true;
bool isStartNull=string.IsNullOrEmpty(allowedStartIp),
isEndNull=string.IsNullOrEmpty(AllowEndIP);
字符串[]startIpBlocks,endIpBlocks,userIp=ip.Split('.');
如果(!string.IsNullOrEmpty(allowedStartIp))
startIpBlocks=允许startip.Split('.');
其他的
startIpBlocks=“0.0.0.0”。拆分('.');
如果(!string.IsNullOrEmpty(allowedEndIp))
endIpBlocks=允许endip.Split('.');
其他的
endIpBlocks=“999.999.999.999”。拆分('.');
for(int i=0;iConvert.ToInt32(endIpBlocks[i]))
返回false;
//如果当前块大于允许的最小值,则ip有效。
else if((Convert.ToInt32(userIp[i])>Convert.ToInt32(startIpBlocks[i]))和&!isStartNull)
返回true;
}
返回true;
}
我将它们转换为整数,然后比较整数。但什么是正确的取决于如何定义范围
UInt32 Ip4ToInt(string ip)
{
UInt32[] parts=ip.Split('.').Select(s=>UInt32.Parse(s)).ToArray();
if (parts.Length != 4)
throw new ArgumentException("InvalidIP");
return (parts[0]<<24) | (parts[1]<<16) | (parts[2]<<8) | parts[3];
}
UInt32 IP4点(字符串ip)
{
UInt32[]parts=ip.Split('.')。选择(s=>UInt32.Parse)).ToArray();
如果(零件长度!=4)
抛出新的ArgumentException(“InvalidIP”);
return(parts[0]我知道System.Net.IPAddress.Address
已弃用
但我认为这是最简单的方法:
bool result = false;
System.Net.IPAddress iStart = System.Net.IPAddress.Parse(ipStart);
System.Net.IPAddress iEnd = System.Net.IPAddress.Parse(ipEnd);
System.Net.IPAddress iIp = System.Net.IPAddress.Parse(ip);
if (iStart.Address <= iIp.Address && iEnd.Address >= iIp.Address)
{
result = true;
}
bool结果=false;
System.Net.IPAddress iStart=System.Net.IPAddress.Parse(ipStart);
System.Net.IPAddress iEnd=System.Net.IPAddress.Parse(ipEnd);
System.Net.IPAddress iIp=System.Net.IPAddress.Parse(ip);
如果(iStart.Address=iIp.Address)
{
结果=真;
}
ps.ipStart、ipEnd、ip是字符串。例如:127.0.0.1最近,我需要在ASP.NET Core中执行类似的操作。我采用了使用System.NET.IPAddress
将ip地址表示为字节
数组的方法。然后,我比较了数组中的元素,以查看主题ip地址是否在范围内。这与CodesInChaos和Pabuc给出的答案类似
System.Net.IPAddress.TryParse(ipAddressRule.StartIpAddress, out var startIpAddress);
System.Net.IPAddress.TryParse(ipAddressRule.EndIpAddress, out var endIpAddress);
if (IsWithinAllowedIpAddresses(clientIpAddress.GetAddressBytes(), startIpAddress.GetAddressBytes(), endIpAddress.GetAddressBytes()))
{
...
}
public bool IsWithinAllowedIpAddresses(byte[] ipAddress, byte[] startAllowIpAddress, byte[] endAllowIpAddress)
{
if (ipAddress.Length != startAllowIpAddress.Length)
{
throw new ArgumentException();
}
if (ipAddress.Length != endAllowIpAddress.Length)
{
throw new ArgumentException();
}
for (int i = 0; i < ipAddress.Length; i++)
{
if (ipAddress[i] < startAllowIpAddress[I])
{
return false;
}
if (ipAddress[i] > endAllowIpAddress[I])
{
return false;
}
}
return true;
}
System.Net.IPAddress.TryParse(ipAddressRule.StartIpAddress,out var StartIpAddress);
System.Net.IPAddress.TryParse(ipAddressRule.EndIpAddress,out var EndIpAddress);
if(IsWithinAllowedIpAddresses(clientIpAddress.GetAddressBytes()、StartIPAddressBytes.GetAddressBytes()、endIpAddress.GetAddressBytes())
{
...
}
public bool不带低地址(字节[]ipAddress,字节[]startLowIPAddress,字节[]endAllowIpAddress)
{
if(ipAddress.Length!=startAllowIpAddress.Length)
{
抛出新ArgumentException();
}
if(ipAddress.Length!=endAllowIpAddress.Length)
{
抛出新ArgumentException();
}
for(int i=0;iendAllowIpAddress[i])
{
返回false;
}
}
返回true;
}
您如何定义IP范围?+1个非常有趣的问题!尽管很奇怪……您是否允许使用CIDR表示法等标准来表示范围?