C# 验证两个IP是否互通

低调的感觉 2014-08-25 02:32:10
需求:
有个挂在外网的网站,分前端和后台管理
前端:任何时间、地点都可以访问
后台:只有公司内部可以访问

前后端是部署在一个站点,我的方案:
服务器有一个内部IP(10.xx.xx.xx),这个IP肯定只有内部可以访问
当访问后台的登录页面时,我想通过获取客户端的IP,去ping这个内网IP,如果能ping通,就是内部用户,否则就跳出这个页面。


请问如何实现?
...全文
432 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
knife_s 2014-08-29
  • 打赏
  • 举报
回复
给内网管理的,同IIS下单独开个端口就是的,外网不开放这个端口 比如说外网是80 内网是8080
wyyw1314xb 2014-08-29
  • 打赏
  • 举报
回复
用权限控制一下行不?
事理 2014-08-26
  • 打赏
  • 举报
回复
这是我目前使用的,测试了一下是可以用的


    #region 判断用户是内网访问还是外网访问

    /// <summary>
    /// 判断访问的用户是在内网还是外网
    /// </summary>
    /// <returns>true内网,false外网</returns>
    public static bool IsLANIP()
    {
        string serverSubnet = GetSubnet();//服务器子网掩码
        if (string.IsNullOrEmpty(serverSubnet)) //如果网关为空,则可能是网络掉线(在服务器访问的网站)
            return true;
        string clientIP = IPAddress;
        if (clientIP == "127.0.0.1")
            return true;

        string serverLANIP = System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName()).GetValue(0).ToString();//服务器内网IP
        string serverNetID = GetNetID(serverLANIP, serverSubnet);
        string clientNetID = GetNetID(clientIP, serverSubnet);

        return serverNetID == clientNetID;
    }

    /// <summary>
    /// 根据ip和子网掩码计算出网络ID
    /// </summary>
    /// <param name="ip">ip地址</param>
    /// <param name="subnetMask">子网掩码</param>
    /// <returns>网络ID</returns>
    public static string GetNetID(string ip, string subnet)
    {
        string[] tempIP = ip.Split('.');
        int tIP = 0;
        int iIP = 0;
        int iMask = 0;
        for (int i = 0; i < 4; i++)    // 把IP从字符串的表示形式改成整型的形式
        {
            tIP = byte.Parse(tempIP[i]);
            iIP += (tIP << (3 - i) * 8);
        }

        tempIP = subnet.Split('.');
        for (int i = 0; i < 4; i++)    // 把掩码从字符串的表示形式改成整型的形式
        {
            tIP = byte.Parse(tempIP[i]);
            iMask += (tIP << (3 - i) * 8);
        }

        tIP = iIP & iMask;

        string netID = ((byte)(tIP >> 24)).ToString();    // 网络ID, IP段
        for (int i = 1; i < 4; i++)
        {
            netID += "." + ((byte)(tIP >> (3 - i) * 8)).ToString();
        }

        return netID;
    }

    /// <summary>
    /// 获取服务器子网掩码
    /// </summary>
    /// <returns></returns>
    public static string GetSubnet()
    {
        string subnet = string.Empty;
        foreach (System.Net.NetworkInformation.NetworkInterface f in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
        {
            System.Net.NetworkInformation.IPInterfaceProperties ipInterface = f.GetIPProperties();
            foreach (System.Net.NetworkInformation.UnicastIPAddressInformation unicastAddress in ipInterface.UnicastAddresses)
            {
                if (unicastAddress.IPv4Mask != null)
                {
                    subnet = unicastAddress.IPv4Mask.ToString();
                    break;
                }
            }
        }
        return subnet;
    }

    #endregion
大湿级 2014-08-26
  • 打赏
  • 举报
回复
你用外网做主界面 然后在页面提供一个登陆连接可以当做内部网络使用。 当然要注意直接复制内部网络地址的连接。
李小冲 2014-08-26
  • 打赏
  • 举报
回复
把那个供使用内网的A单独建个网站,只允许内网访问,至于说文件上传,可以使用junction进行映射一下就可以了。
饕餮123 2014-08-26
  • 打赏
  • 举报
回复
引用 9 楼 loveyang7733 的回复:
[quote=引用 8 楼 ayanamireizero 的回复:] [quote=引用 7 楼 loveyang7733 的回复:] [quote=引用 6 楼 ayanamireizero 的回复:] 在内部IP(10.XX.XX.XX)上部署一个小接口,访问那个只有内网页面时访问这个接口,返回"ok"就可以访问该页面.
这个接口需要怎么做?[/quote] 比如直接 return "ok"; 或比如index.html 就直接丢个ok就得了 就可以了... 登录该页面的用户首先去访问10.xxx.xxx.xxx/,抓取该页面内容,如果为"ok"就继续,如果不是"ok"就直接redirect到其他页面去.[/quote] 这个接口和这个网站都部署在同一台服务器上,那通过页面肯定每次都可以正常访问到这个接口啊,和内外网访问没什么关系吧![/quote] response.redirect最后还是要客户端发起的 楼主上面的方法太复杂了,这个目测是最简单可行的
rayyu1989 2014-08-25
  • 打赏
  • 举报
回复
<script>var NeiWang =false;</script> <script src="内网的一个脚本地址">/* 脚本内部 NeiWang = true; */</script> <script>if(NeiWang)alert("内网");else alert("外网");</script>
帅得_被人砍 2014-08-25
  • 打赏
  • 举报
回复
我也在寻求解决方法 ,楼主要是解决了话 ,分享一下,回我一下
sy401042879 2014-08-25
  • 打赏
  • 举报
回复
按你说的,不是10.xx.xx.xx的ip那就是外网ip了。不用ping,判断一下就可以了。
Rajesh_James 2014-08-25
  • 打赏
  • 举报
回复
引用 2 楼 loveyang7733 的回复:
[quote=引用 1 楼 FoxDave 的回复:] 没明白 你把所谓的后台挂到了外网上,然后还不想让别人访问???
就是把一个网站挂到了外网,然后有个页面A不想让别人访问,只想让内部人员访问A;[/quote] 楼主,既然你的后台不想被外网访问,那你为什么要发布到外网呢,直接发布在内网服务器上不行吗?
低调的感觉 2014-08-25
  • 打赏
  • 举报
回复
引用 8 楼 ayanamireizero 的回复:
[quote=引用 7 楼 loveyang7733 的回复:] [quote=引用 6 楼 ayanamireizero 的回复:] 在内部IP(10.XX.XX.XX)上部署一个小接口,访问那个只有内网页面时访问这个接口,返回"ok"就可以访问该页面.
这个接口需要怎么做?[/quote] 比如直接 return "ok"; 或比如index.html 就直接丢个ok就得了 就可以了... 登录该页面的用户首先去访问10.xxx.xxx.xxx/,抓取该页面内容,如果为"ok"就继续,如果不是"ok"就直接redirect到其他页面去.[/quote] 这个接口和这个网站都部署在同一台服务器上,那通过页面肯定每次都可以正常访问到这个接口啊,和内外网访问没什么关系吧!
ayanamireizero 2014-08-25
  • 打赏
  • 举报
回复
引用 7 楼 loveyang7733 的回复:
[quote=引用 6 楼 ayanamireizero 的回复:] 在内部IP(10.XX.XX.XX)上部署一个小接口,访问那个只有内网页面时访问这个接口,返回"ok"就可以访问该页面.
这个接口需要怎么做?[/quote] 比如直接 return "ok"; 或比如index.html 就直接丢个ok就得了 就可以了... 登录该页面的用户首先去访问10.xxx.xxx.xxx/,抓取该页面内容,如果为"ok"就继续,如果不是"ok"就直接redirect到其他页面去.
低调的感觉 2014-08-25
  • 打赏
  • 举报
回复
引用 6 楼 ayanamireizero 的回复:
在内部IP(10.XX.XX.XX)上部署一个小接口,访问那个只有内网页面时访问这个接口,返回"ok"就可以访问该页面.
这个接口需要怎么做?
ayanamireizero 2014-08-25
  • 打赏
  • 举报
回复
在内部IP(10.XX.XX.XX)上部署一个小接口,访问那个只有内网页面时访问这个接口,返回"ok"就可以访问该页面.
save4me 2014-08-25
  • 打赏
  • 举报
回复
如果是你们自己的服务,你可以直接在IIS管理器里面设置对整站或某个文件夹的访问权限,包括IP和掩码等。 参考: 如何: 将限制通过 IP 地址或域名的网站访问权限
低调的感觉 2014-08-25
  • 打赏
  • 举报
回复
引用 3 楼 FoxDave 的回复:
[quote=引用 2 楼 loveyang7733 的回复:] [quote=引用 1 楼 FoxDave 的回复:] 没明白 你把所谓的后台挂到了外网上,然后还不想让别人访问???
就是把一个网站挂到了外网,然后有个页面A不想让别人访问,只想让内部人员访问A;[/quote] 那就把A单独一个网站做出来,内网就直接用IP访问好了[/quote] 我的页面A有个上传图片的功能,如果单独建一个站点用内部IP访问,这时在页面A上传的图片就无法在网站首页显示。。
Justin-Liu 2014-08-25
  • 打赏
  • 举报
回复
引用 2 楼 loveyang7733 的回复:
[quote=引用 1 楼 FoxDave 的回复:] 没明白 你把所谓的后台挂到了外网上,然后还不想让别人访问???
就是把一个网站挂到了外网,然后有个页面A不想让别人访问,只想让内部人员访问A;[/quote] 那就把A单独一个网站做出来,内网就直接用IP访问好了
低调的感觉 2014-08-25
  • 打赏
  • 举报
回复
引用 1 楼 FoxDave 的回复:
没明白 你把所谓的后台挂到了外网上,然后还不想让别人访问???
就是把一个网站挂到了外网,然后有个页面A不想让别人访问,只想让内部人员访问A;
Justin-Liu 2014-08-25
  • 打赏
  • 举报
回复
没明白 你把所谓的后台挂到了外网上,然后还不想让别人访问???

62,073

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧