我们提供安全,免费的手游软件下载!

安卓手机游戏下载_安卓手机软件下载_安卓手机应用免费下载-先锋下载

当前位置: 主页 > 软件教程 > 软件教程

ASP.NET Core中使用ActionFilterAttribute实现API安全验证

来源:网络 更新时间:2024-05-18 04:32:06

在现代应用开发中,确保API的安全性和可靠性至关重要。面向切面编程(AOP)通过将横切关注点(如验证、日志记录、异常处理)与核心业务逻辑分离,极大地提升了代码的模块化和可维护性。在ASP.NET Core中,利用 ActionFilterAttribute 可以方便地实现AOP的理念,能够以简洁、高效的方式进行自定义验证。本文将分享如何通过创建 ValidateClientAttribute 来验证客户端ID,并探讨这种方法如何体现AOP的诸多优势。

本文使用场景是在我之前开发的单点认证项目中,当时的项目名称是 IdentityServerLite ,作为参考 IdentityServer4 设计的一个轻量级单点认证解决方案。在单点认证项目中,像登录、获取AccessToken、请求Token等操作都需要验证用户传入的Client ID参数是否有效。这部分逻辑是有些重复的,于是我就像使用一种更高效的方式来实现这个功能。

ActionFilterAttribute 是ASP.NET Core提供的一个方便工具,用于在控制器的操作方法执行之前或之后添加自定义逻辑。这种机制使得我们可以在不改变操作方法本身的情况下,插入额外的处理逻辑,如验证、日志记录、异常处理等。这种特性体现了面向切面编程(AOP)的理念,能够有效地分离关注点,提高代码的模块化和可维护性。

首先是确定了这个功能是使用Attribute的形式来添加到接口的外边,然后覆盖 ActionFilterAttribute OnActionExecutionAsync 方法来实现具体的校验逻辑。之后还需要把从数据库里查找到的Client对象保存到HttpContext里,方便接口中使用这个对象。

Client ID所在的位置不确定,需要在使用的时候配置。定义一个枚举 ClientIdSource ,用于指示Client ID的位置。

Filters 目录中创建 ValidateClientAttribute.cs 文件。根据配置,从指定的位置根据指定的参数名称读取Client ID,然后在数据库中查询。通过继承 ActionFilterAttribute ,重写 OnActionExecuting 方法,实现校验逻辑。

有几点需要注意的,下面介绍一下。首先是通过反射获取request body的参数。其他几个参数位置还好,获取都比较容易。如果是POST或者PUT方法,一般都是把数据以JSON的形式放在RequestBody里。这个时候,我们可以去读取这个Body的值,但读取完之后得自己解析JSON,还得把Stream写回去,有点麻烦。而且如果Body是XML形式,还要用其他的解析方式。这里我使用了反射的方式,让AspNetCore框架去处理这个RequestBody,然后我直接用反射,根据参数名去读取Client ID。

这是几个使用例子。参数在Body里,然后DTO里的参数名是ClientId。在接口中使用 [HttpPost("login/password") [ValidateClient(ClientIdSource.Body, ParameterName = "ClientId")

参数在Query Params里,参数名称是 client_id . 在接口中使用 [HttpGet("authorize/url") [ValidateClient(ClientIdSource.Query, ParameterName = "client_id")

参考资料: https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/filters , https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-context