我们提供安全,免费的手游软件下载!
在现代应用开发中,确保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
热门资讯