C#进阶:基于.NET Framework 4.x 实现 ASP.NET WebForms IP 拦截器 | 极客日志
C#
C#进阶:基于.NET Framework 4.x 实现 ASP.NET WebForms IP 拦截器
本文介绍了在 ASP.NET WebForms 项目中实现 IP 地址访问控制的方法。通过自定义 SoapExtension 处理 SOAP 协议请求,以及使用 IHttpModule 处理 HTTP 协议请求,结合 web.config 配置白名单和代码注解,实现对 ASMX Web 服务方法的 IP 拦截。该方法增强了应用安全性,支持全局与方法级白名单配置。
imJackJia0 浏览
本文将探讨如何在 ASP.NET WebForms 中实现 IP 拦截器,以便在 ASMX Web 服务方法和 HTTP 请求中根据 IP 地址进行访问控制。我们将使用自定义的 SoapExtension 和 IHttpModule 来实现这一功能,并根据常用的两种文本传输协议:SOAP 协议和 HTTP 协议分别讲解。
一、创建 ASMX 接口文件
首先,我们创建一个 ASP.NET WebForms 项目,创建 TestAsmxProject.Asmx 文件,并定义里面的 WebService 服务。
TestAsmxProject.Asmx 代码如下:
using System.Web.Services;
namespaceTestAsmxProject.Asmx
{
///<summary>/// Test 的摘要说明///</summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
[System.Web.Script.Services.ScriptService]
publicclassTest : System.Web.Services.WebService
{
[WebMethod]
publicstringHelloWorld()
{
return"Hello World";
}
[WebMethod(Description = "计算两个数的和")]
publicintAdd(int a, int b)
{
return a + b;
}
}
}
从这个类我们可以看到,目前是有两个 WebService 方法:HelloWorld 方法和 Add 方法。调用 HelloWorld 方法会返回 "Hello World" 字符串;用 Add 方法,需要传入 a 和 b 两个参数,会返回 a 和 b 相加的和。
二、基于 SOAP 协议的拦截器实现
创建一个自定义的 SoapExtension 来实现 IP 拦截。我们还需要一个自定义属性来指定允许的 IP 地址。
using System.Web.Services;
using TestAsmxProject.Filter.HTTP;
namespaceTestAsmxProject.Asmx
{
///<summary>/// Test 的摘要说明///</summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
[System.Web.Script.Services.ScriptService]
publicclassTest : System.Web.Services.WebService
{
[WebMethod]
[IpFilter] // 不传入指定 IP,使用 web.config 中的白名单publicstringHelloWorld()
{
return"Hello World";
}
[WebMethod(Description = "计算两个数的和")]
[IpFilter("127.0.0.1", "192.168.1.1")] // 此处为该方法的 IP 白名单,加上 web.config 中的白名单共同生效publicintAdd(int a, int b)
{
return a + b;
}
}
}
四、IP 拦截器实现总结
通过上述步骤,我们成功实现了在 ASP.NET WebForms 中基于 IP 地址的访问控制。我们分别使用自定义的 SoapExtension 和 IHttpModule,实现了对 ASMX Web 服务方法和 HTTP 请求的 IP 拦截。
1. 自定义 SoapExtension
自定义的 SoapExtension 通过重载 ProcessMessage 方法,在 SOAP 消息处理的不同阶段进行 IP 地址的验证。通过检查请求的 IP 地址并与允许的 IP 列表进行比较,我们可以在消息反序列化之前阻止不符合条件的请求,从而有效地控制对 Web 服务方法的访问。这种方法特别适用于基于 SOAP 的 Web 服务,能够在服务方法调用之前进行精细的访问控制。
2. 自定义 IHttpModule
自定义的 IHttpModule 通过实现 Init 方法并注册 PreRequestHandlerExecute 事件,在每个 HTTP 请求处理之前执行 IP 地址验证。通过反射获取请求对应的方法,并检查方法上的自定义属性 IpFilterAttribute,我们可以动态地对特定方法应用 IP 过滤规则。结合 web.config 中配置的白名单 IP 地址,这种方法能够灵活地扩展和维护 IP 访问控制规则,适用于一般的 HTTP 请求拦截需求。
3. 本文提供方法的实现优势
这种 IP 拦截器的实现方法不仅增强了应用程序的安全性,还具有良好的扩展性和可维护性。开发者可以根据具体需求,通过配置文件或代码注解灵活地管理允许的 IP 地址。通过将安全控制逻辑封装在自定义模块和扩展中,可以保持业务代码的简洁和可读性。