Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用c根据一系列值检查ip地址的最简单方法#_C#_Asp.net_Ip - Fatal编程技术网

C# 使用c根据一系列值检查ip地址的最简单方法#

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

我们正在编写一个允许管理员阻止/允许ip地址范围的功能

用c#做这件事够容易吗

我想看看每个数字[这里][这里][这里][这里],然后把它与范围匹配,看看每个数字是否在两者之间

这对标准ip v4地址有效吗?

公共静态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表示法等标准来表示范围?