C# WebAPI 中过滤器Filter应用之IP访问控制

本文介绍了在WebAPI开发中如何利用ActionFilter实现接口的IP访问控制,以增强安全性。通过创建自定义的AccessFilter,检查请求IP是否在授权列表中,阻止未经授权的访问,并提供异常处理功能。

        我们在做后台接口开发的时候,为了保障接口访问安全,IP访问控制是必不可少的,这里运用filter的特性来完成接口访问控制。

        Filter在Web API中经常会用到,主要用于记录日志,安全验证,全局错误处理等,通过Filter能统一地对一些通用逻辑进行处理。在默认的WebApi中,框架提供了2种Filter,分别继承actionfilterattribute,exceptionfilterattribute。actionfilter主要实现执行请求方法体之前和之后的事件处理,exceptionfilter主要实现触发异常方法。

        这里使用actionfilter来完成IP访问控制:

1、在接口类/方法添加过滤器

    [AccessFilter]
    public class PasswordController : ApiController
    {
        public ResponseModel Get(string openId)
        {
            if (string.IsNullOrEmpty(openId))
            {
                LogHelper.Info(Resource.OpenIdInvalid);
                response.Message = Resource.OpenIdInvalid;
                return response;
            }
        }
     }

 2、新建ActionFilter类

 public class AccessFilter : ActionFilterAttribute
    {
        /// <
C# Web API 中实现控制器的 AOP(面向切面编程)功能,主要可以通过以下几种方式来完成,每种方式都有其适用场景和实现机制。 ### 1. 使用 Filter过滤器Filter 是 ASP.NET Web API 框架内置的 AOP 实现之一,允许在请求处理的不同阶段插入自定义逻辑。常见的 Filter 类型包括: - **Action Filter**:在 Action 方法执行前后执行。 - **Authorization Filter**:用于身份验证和授权。 - **Exception Filter**:用于全局异常处理。 - **Result Filter**:在 Action 结果执行前后执行。 例如,定义一个简单的 Action Filter: ```csharp public class LoggingActionFilter : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { // 在 Action 执行前执行 var controller = actionContext.ControllerContext.Controller; var action = actionContext.ActionDescriptor; // 记录日志 } public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { // 在 Action 执行后执行 var response = actionExecutedContext.Response; // 记录响应信息 } } ``` 然后可以在控制器或 Action 上使用该 Filter: ```csharp [LoggingActionFilter] public class SampleController : ApiController { public IHttpActionResult Get() { return Ok("Hello World"); } } ``` 此类 Filter 的执行顺序为:`OnActionExecuting` → `Action` → `OnActionExecuted` [^4]。 --- ### 2. 使用 Castle DynamicProxy 实现 AOP 对于更复杂的 AOP 需求,可以借助 **Castle DynamicProxy** 库来实现运行时动态代理。其核心思想是通过拦截器(Interceptor)对方法调用进行拦截和增强。 首先,安装 Castle.Core NuGet 包: ```bash Install-Package Castle.Core ``` 然后定义一个拦截器: ```csharp public class LoggingInterceptor : IInterceptor { public void Intercept(IInvocation invocation) { Console.WriteLine($"Before method: {invocation.Method.Name}"); invocation.Proceed(); // 执行原方法 Console.WriteLine($"After method: {invocation.Method.Name}"); } } ``` 在控制器中使用: ```csharp var proxyGenerator = new ProxyGenerator(); var interceptor = new LoggingInterceptor(); var proxy = proxyGenerator.CreateClassProxy<SampleController>(interceptor); proxy.Get(); // 此时会触发拦截逻辑 ``` 这种方式适用于需要对业务逻辑层进行拦截的场景,但对 Web API 控制器本身并不直接适用,因为控制器由框架管理生命周期,不能直接使用代理。因此更常见的是将其应用于服务层 [^2]。 --- ### 3. 使用 Autofac 的 AOP 功能 Autofac 是一个流行的依赖注入容器,它通过集成 **Castle DynamicProxy** 实现 AOP 功能。可以在注册服务时配置拦截器。 首先,安装必要的 NuGet 包: ```bash Install-Package Autofac Install-Package Autofac.Extras.DynamicProxy ``` 定义拦截器类: ```csharp public class LoggingInterceptor : IInterceptor { public void Intercept(IInvocation invocation) { Console.WriteLine("Before method call"); invocation.Proceed(); Console.WriteLine("After method call"); } } ``` 注册服务并启用拦截: ```csharp var builder = new ContainerBuilder(); builder.RegisterType<SampleService>().EnableInterfaceInterceptors().InterceptedBy(typeof(LoggingInterceptor)); builder.Register(c => new LoggingInterceptor()).As<IInterceptor>(); var container = builder.Build(); ``` 然后在控制器中注入服务即可,调用服务方法时会自动应用拦截逻辑 [^1]。 --- ### 4. 使用 Attribute + AOP 的方式 通过自定义 Attribute 和拦截器的结合,可以实现更灵活的 AOP 逻辑。例如,定义一个自定义特性: ```csharp [AttributeUsage(AttributeTargets.Method)] public class LogExecutionTimeAttribute : Attribute, IActionFilter { public void OnActionExecuting(HttpActionContext filterContext) { /* 实现逻辑 */ } public void OnActionExecuted(HttpActionExecutedContext filterContext) { /* 实现逻辑 */ } } ``` 然后在控制器方法上使用: ```csharp [LogExecutionTime] public IHttpActionResult GetData() { return Ok("Data"); } ``` 这种方式可以实现基于特性的拦截逻辑,适用于需要按需启用 AOP 的场景 [^2]。 --- ### 5. 使用中间件(Middleware)实现全局 AOP 效果 虽然中间件不属于传统意义上的 AOP,但其在整个请求管道中插入逻辑的能力,可以模拟 AOP 的行为。例如记录请求日志、身份验证等。 定义中间件如下: ```csharp public class RequestLoggingMiddleware { private readonly RequestDelegate _next; public RequestLoggingMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { // 请求前处理 await _next(context); // 继续管道 // 请求后处理 } } ``` 在 `Startup.cs` 中注册中间件: ```csharp app.UseMiddleware<RequestLoggingMiddleware>(); ``` 这种机制适用于全局逻辑,不针对特定控制器或方法 [^3]。 --- ### 总结 在 C# Web API 中实现控制器的 AOP 功能,可以根据需求选择不同的实现方式: - **Filter**:适用于 Web API 框架内的请求拦截。 - **Castle DynamicProxy**:适用于服务层或非控制器类的拦截。 - **Autofac AOP**:结合依赖注入实现更灵活的拦截逻辑。 - **Attribute + AOP**:实现基于特性的动态拦截。 - **中间件**:适用于全局请求处理。 每种方式都有其适用场景,开发者可以根据项目结构和需求选择合适的方案。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MarcoPro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值