我正在开发一个 ASP.NET Core 项目,其中使用 FluentValidation 进行 DTO 验证,并且还实现了自定义授权过滤器。目前,我面临着一个挑战,授权过滤器在 FluentValidation 检查之前执行,但我需要先运行 FluentValidation。这很重要,因为如果传入的 DTO 无效,我希望避免授权过滤器中发生不必要的数据库命中。
以下是我的设置的简要概述:
自定义授权过滤器:我有一个自定义授权过滤器来检查用户权限。它访问数据库来验证权限,因此如果 DTO 已经无效,我想避免运行此过滤器。
public class MyAuthorizationFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
// Authorization logic that hits the database
}
}
控制器操作:在我的控制器操作中,我同时使用 FluentValidation 和授权过滤器。
[HttpPost]
[ServiceFilter(typeof(MyAuthorizationFilter))]
public IActionResult Create([FromBody] MyDto myDto)
{
// Controller action logic
}
我的问题是:如何配置 ASP.NET Core 应用程序,以便 FluentValidation 在执行自定义授权过滤器之前运行并完成?我想确保如果 DTO 根据 FluentValidation 规则无效,则应在到达授权逻辑之前终止请求,从而避免不必要的数据库操作。
任何有关如何实现这一目标的建议或指导将不胜感激!
您可以做的一件事是制作一个像您制作的授权过滤器一样的 ActionFilter
public class FluentValidationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
//handle your fluent validation here and if it is fine
base.OnActionExecuting(context);
//else return error status code or throw exception
}
}
将此属性添加到上一行
[ServiceFilter(typeof(MyAuthorizationFilter))]
之前,作为 [FluentValidationAttribute]
这将首先检查验证,然后去数据库进行身份验证。