如何在 ASP.NET Core 中的授权过滤器之前运行 FluentValidation

问题描述 投票:0回答:1

我正在开发一个 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 规则无效,则应在到达授权逻辑之前终止请求,从而避免不必要的数据库操作。

任何有关如何实现这一目标的建议或指导将不胜感激!

.net filter authorization dto fluentvalidation
1个回答
0
投票

您可以做的一件事是制作一个像您制作的授权过滤器一样的 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]

这将首先检查验证,然后去数据库进行身份验证。

© www.soinside.com 2019 - 2024. All rights reserved.