下面是一份关于 C# 进阶 — 基于 .NET Framework 4.x 实现 ASP.NET WebForms 项目 IP 拦截器 的详细技术方案与示例代码,适合作为学习笔记、技术文档或项目参考。
目录
- 需求分析
- 设计思路
- 关键技术点
- IP 拦截器实现方案
- 代码示例
- 部署与测试
- 拓展功能建议
1. 需求分析
- 在 ASP.NET WebForms 项目中,根据请求的客户端 IP 地址做访问控制。
- 拦截黑名单 IP,禁止访问页面或接口。
- 支持白名单 IP,优先允许访问。
- 方便维护 IP 列表,可扩展到数据库或配置文件。
- 拦截操作应尽量高效,减少性能损耗。
2. 设计思路
- 利用 ASP.NET 生命周期钩子,在请求进入时检查客户端 IP。
- 推荐在
Global.asax
的Application_BeginRequest
事件中拦截请求。 - 获取客户端 IP 地址(注意代理情况)。
- 将 IP 与黑白名单进行匹配判断。
- 拦截则直接返回响应或重定向,否则继续正常流程。
3. 关键技术点
- 获取客户端真实 IP:
- 通过
Request.UserHostAddress
- 或判断
X-Forwarded-For
、HTTP_X_FORWARDED_FOR
等代理头
- 通过
- 存储 IP 黑白名单:
- 可放在 Web.config appSettings
- 也可使用数据库、文件或缓存
- 请求拦截实现:
- 直接在
BeginRequest
终止请求 - 返回自定义提示或 403 禁止访问状态码
- 直接在
4. IP 拦截器实现方案
- 步骤:
- 读取配置的黑白名单 IP(支持单个 IP 或 CIDR 范围)
- 获取当前请求 IP
- 优先判断是否在白名单,是则放行
- 判断是否在黑名单,是则拦截
- 否则正常访问
- 优化:
- 缓存 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 的类似功能,欢迎随时告诉我!
发表回复