下面是一份关于 C# 进阶 — 基于 .NET Framework 4.x 实现 ASP.NET WebForms 项目 IP 拦截器 的详细技术方案与示例代码,适合作为学习笔记、技术文档或项目参考。

目录

  1. 需求分析
  2. 设计思路
  3. 关键技术点
  4. IP 拦截器实现方案
  5. 代码示例
  6. 部署与测试
  7. 拓展功能建议

1. 需求分析

  • 在 ASP.NET WebForms 项目中,根据请求的客户端 IP 地址做访问控制。
  • 拦截黑名单 IP,禁止访问页面或接口。
  • 支持白名单 IP,优先允许访问。
  • 方便维护 IP 列表,可扩展到数据库或配置文件。
  • 拦截操作应尽量高效,减少性能损耗。

2. 设计思路

  • 利用 ASP.NET 生命周期钩子,在请求进入时检查客户端 IP。
  • 推荐在 Global.asax 的 Application_BeginRequest 事件中拦截请求。
  • 获取客户端 IP 地址(注意代理情况)。
  • 将 IP 与黑白名单进行匹配判断。
  • 拦截则直接返回响应或重定向,否则继续正常流程。

3. 关键技术点

  • 获取客户端真实 IP
    • 通过 Request.UserHostAddress
    • 或判断 X-Forwarded-ForHTTP_X_FORWARDED_FOR 等代理头
  • 存储 IP 黑白名单
    • 可放在 Web.config appSettings
    • 也可使用数据库、文件或缓存
  • 请求拦截实现
    • 直接在 BeginRequest 终止请求
    • 返回自定义提示或 403 禁止访问状态码

4. IP 拦截器实现方案

  • 步骤
    1. 读取配置的黑白名单 IP(支持单个 IP 或 CIDR 范围)
    2. 获取当前请求 IP
    3. 优先判断是否在白名单,是则放行
    4. 判断是否在黑名单,是则拦截
    5. 否则正常访问
  • 优化
    • 缓存 IP 列表
    • 支持 CIDR 或 IP 段匹配
    • 支持日志记录拦截事件

5. 代码示例

5.1 Global.asax.cs 中实现

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Web;

public class Global : System.Web.HttpApplication
{
    private static HashSet<string> WhiteListIPs;
    private static HashSet<string> BlackListIPs;

    protected void Application_Start(object sender, EventArgs e)
    {
        // 初始化 IP 黑白名单,示例从配置读取
        var whiteListStr = ConfigurationManager.AppSettings["WhiteListIPs"] ?? "";
        var blackListStr = ConfigurationManager.AppSettings["BlackListIPs"] ?? "";

        WhiteListIPs = new HashSet<string>(whiteListStr.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries));
        BlackListIPs = new HashSet<string>(blackListStr.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries));
    }

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var userIP = GetClientIp(HttpContext.Current.Request);

        // 优先白名单
        if (WhiteListIPs.Contains(userIP))
        {
            return; // 放行
        }

        // 黑名单阻止
        if (BlackListIPs.Contains(userIP))
        {
            HttpContext.Current.Response.StatusCode = 403; // 禁止访问
            HttpContext.Current.Response.StatusDescription = "Forbidden: Your IP is blocked.";
            HttpContext.Current.Response.End();
        }
    }

    private string GetClientIp(HttpRequest request)
    {
        // 优先获取代理头部 IP
        string ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"];

        if (!string.IsNullOrEmpty(ip))
        {
            // 多个代理 IP 取第一个非unknown
            string[] ipList = ip.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            foreach (var item in ipList)
            {
                if (!string.Equals(item.Trim(), "unknown", StringComparison.OrdinalIgnoreCase))
                {
                    return item.Trim();
                }
            }
        }

        // 默认
        return request.UserHostAddress;
    }
}

5.2 Web.config 配置示例

<appSettings>
    <add key="WhiteListIPs" value="192.168.1.10,127.0.0.1" />
    <add key="BlackListIPs" value="10.0.0.100,123.123.123.123" />
</appSettings>

6. 部署与测试

  • 将代码部署至 IIS 环境。
  • 在浏览器中测试不同 IP 访问。
  • 可通过 VPN 或代理模拟不同 IP 测试。
  • 验证被拦截 IP 返回 403 状态。

7. 拓展功能建议

  • 支持 IP 段(CIDR)匹配,便于大范围管理。
  • 支持动态从数据库读取黑白名单,支持后台管理。
  • 添加日志记录拦截事件(时间、IP、请求地址等)。
  • 支持拦截提示自定义页面。
  • 集成缓存机制提高性能。

总结

  • 本文基于 .NET Framework 4.x ASP.NET WebForms 项目,利用 Global.asax 的生命周期事件,实现了简单的 IP 拦截器。
  • 关键在于准确获取客户端 IP,并灵活管理黑白名单。
  • 方案轻量、易集成,适合中小型 Web 项目安全加固。

如果你需要,我还能帮你实现更完整的 IP 段匹配库、数据库管理示例,或者基于 ASP.NET MVC/Core 的类似功能,欢迎随时告诉我!