LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

通过C#控制IIS网站只允许指定的动态IP白名单地址访问,访问者不在白名单的一律跳转到其他指定的外部网站网页

admin
2025年3月15日 17:39 本文热度 466

以下是完整的C代码实现方案,结合IIS动态配置与全自动跳转功能:

一、核心功能实现代码

using Microsoft.Web.Administration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;

public class IPFilterAttribute : ActionFilterAttribute
{
    private static List<string> _allowedIPs = new List<string>
    {
        "192.168.1.1",
        "10.0.0.0-10.0.0.255" // 支持IP段格式
    };

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string clientIP = GetClientIP();
        if (!IsAllowedIP(clientIP))
        {
            filterContext.Result = new RedirectResult("https://external-block-page.com");
            LogBlockedIP(clientIP);
        }
    }

    private string GetClientIP()
    {
        string ip = HttpContext.Current.Request.Headers["X-Forwarded-For"]?.Split(',')[0];
        return string.IsNullOrEmpty(ip) ? HttpContext.Current.Request.UserHostAddress : ip;
    }

    private bool IsAllowedIP(string ip)
    {
        return _allowedIPs.Contains(ip) || IPRangeContains(ip, _allowedIPs);
    }

    private bool IPRangeContains(string ip, List<string> ipRanges)
    {
        foreach (var range in ipRanges.Where(r => r.Contains('-')))
        {
            var start = IPAddress.Parse(range.Split('-')[0]);
            var end = IPAddress.Parse(range.Split('-')[1]);
            var client = IPAddress.Parse(ip);
            if (client.AddressFamily == AddressFamily.InterNetworkV6)
                throw new NotSupportedException("IPv6 range check not implemented");
            var bytes = client.GetAddressBytes();
            var startBytes = start.GetAddressBytes();
            var endBytes = end.GetAddressBytes();
            if (bytes.CompareTo(startBytes) >= 0 && bytes.CompareTo(endBytes) <= 0)
                return true;
        }
        return false;
    }

    private void LogBlockedIP(string ip)
    {
        File.AppendAllText("blocked_ips.log", $"{DateTime.Now}: Blocked IP - {ip}\n");
    }

    public static void SyncIISWhitelist()
    {
        try
        {
            using (ServerManager serverManager = new ServerManager())
            {
                var siteName = "OA_SITE"; // 替换为实际网站名称
                var site = serverManager.Sites.FirstOrDefault(s => s.Name == siteName);
                if (site == null) throw new Exception($"网站 '{siteName}' 未找到");

                var config = serverManager.GetApplicationHostConfiguration();
                var ipSecuritySection = config.GetSection("system.webServer/security/ipSecurity", siteName);
                
                if (ipSecuritySection == null)
                {
                    ipSecuritySection = config.CreateSection("system.webServer/security/ipSecurity", siteName);
                    ipSecuritySection["allowUnlisted"] = false; // 关键配置:未列出的IP自动拒绝
                }

                var ipCollection = ipSecuritySection.GetCollection();
                ipCollection.Clear(); // 清空现有规则

                foreach (var ip in _allowedIPs)
                {
                    var addElement = ipCollection.CreateElement("add");
                    addElement["ipAddress"] = ip;
                    addElement["action"] = "Allow";
                    addElement["allowed"] = true;
                    ipCollection.Add(addElement);
                }

                serverManager.CommitChanges();
            }
        }
        catch (Exception ex)
        {
            File.AppendAllText("sync_error.log", $"{DateTime.Now}: {ex.Message}\n");
        }
    }
}

二、关键配置说明

IIS配置文件修改

在 web.config 中添加以下配置,启用IP安全规则:

<system.webServer>
  <security>
    <ipSecurity allowUnlisted="false" />
  </security>
</system.webServer>

引用说明:此配置确保未在白名单中的IP自动被拒绝。

管理员权限要求

程序需以管理员身份运行,否则无法修改IIS配置。

在Windows中可通过:

 右键exe -> 属性 -> 兼容性 -> 以管理员身份运行此程序 

IP范围支持

代码支持IP段格式(如 10.0.0.0-10.0.0.255 ),通过 IPRangeContains 方法实现范围检查。

三、部署与调用步骤

初始化白名单同步

在网站启动时调用 SyncIISWhitelist() 方法,确保IIS规则与代码一致:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    SyncIISWhitelist(); // 同步白名单到IIS
}

应用层拦截配置

在 Global.asax 中注册全局过滤器:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new IPFilterAttribute());
    }
}

日志与监控

封禁日志记录到 blocked_ips.log ,便于审计。

建议集成ELK或Prometheus监控日志文件,异常IP封禁时触发告警。

 

四、功能验证

白名单生效验证

通过IIS管理器检查网站配置,确认 ipSecurity 节点已正确添加白名单IP。

使用非白名单IP访问网站,应自动跳转至外部页面。

IP范围测试

添加IP段 192.168.2.0-192.168.2.100 到白名单,验证该网段内所有IP均可访问。

 

五、安全增强建议

双重验证机制

在跳转前增加验证码验证,防止自动化工具绕过IP限制。

动态白名单更新

通过管理后台提供界面,支持手动添加/删除白名单IP。

定期从AD域控同步内部员工IP。

备份与回滚

定期备份IIS配置文件( %windir%\System32\inetsrv\config\applicationHost.config )。

实现配置变更回滚功能,防止误操作导致服务中断。


通过以上方案,可实现全自动化的IP白名单控制与访问跳转,有效抵御外部攻击。建议配合WAF(Web应用防火墙)和DDoS防护服务,构建纵深防御体系。


该文章在 2025/3/15 17:40:26 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved