操作过滤器在 asp.net 核心 Web API 中不起作用

Posted

技术标签:

【中文标题】操作过滤器在 asp.net 核心 Web API 中不起作用【英文标题】:Action Filter is not working in asp.net core Web API 【发布时间】:2020-07-23 15:59:14 【问题描述】:

我为 ASP.NET Core 3.1 Web API 中的 HTTP 请求验证创建了一个操作过滤器。

不幸的是,它不起作用。问题必须在控制器级别,因为在 .NET Framework 中也是如此。

CustomAuthorize.cs

public class CustomAuthorize : ActionFilterAttribute

    private readonly IConfiguration _configuration;

    public CustomAuthorize(IConfiguration configuration)
    
        _configuration = configuration;
    

    public override void OnActionExecuting(HttpActionContext context)
    
        string secrect = _configuration.GetSection("AuthJWT").GetSection("Secrect").Value;
        var request = context.Request.Headers.GetValues("AuthJWT").FirstOrDefault();
        //Add Validation code here
        base.OnActionExecuting(context);

    

HomeController

[Route("[controller]")]
[ApiController]
[ServiceFilter(typeof(CustomAuthorize))]
public class HomeController : ControllerBase
       
    [HttpGet("getdata")]
    public IActionResult GetData()
    
        return Ok("Success");
    

Startup.cs

public class Startup

    public Startup(IConfiguration configuration)
    
        Configuration = configuration;
    
    public IConfiguration Configuration  get; 

    public void ConfigureServices(IServiceCollection services)
    
        services.AddCors();

        services.AddControllers();

        services.AddScoped<CustomAuthorize>();

    

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    
        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        
            endpoints.MapControllers();
        );
    

【问题讨论】:

我们需要看到过滤器的完整代码和验证码至少相关部分...... 它是如何“不工作”的......我们需要能够重现这一点。所以你需要为一个完全可重现的例子发布足够的代码和信息 【参考方案1】:

ActionFilterAttribute 抽象类包括以下重写方法:

void OnActionExecuted(ActionExecutedContext filterContext)
void OnActionExecuting(ActionExecutingContext filterContext)
void OnResultExecuted(ResultExecutedContext filterContext)
void OnResultExecuting(ResultExecutingContext filterContext)

OnActionExecuting 中使用ActionExecutingContext

只需要修改OnActionExecutingCustomAuthorize。其他代码和你一样。

        public override void OnActionExecuting(ActionExecutingContext context)
        
            string secrect = _configuration.GetSection("AuthJWT").GetSection("Secrect").Value;
            
            var request = context.HttpContext.Request.Headers["AuthJWT"].FirstOrDefault();
            //Add Validation code here
            base.OnActionExecuting(context);

        

结果测试

【讨论】:

@sambeet das 很高兴听到这个消息。您能否标记此答案以帮助他人。 :D

以上是关于操作过滤器在 asp.net 核心 Web API 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?

ASP.NET Web API路由系统:路由系统的几个核心类型

如何在asp.net核心中从客户端调用web api方法?

Web APi Vs MVC 和在 ASP.net 核心 Web APi 中提供静态文件

Asp.net Web Api 作为 Api 网关

如何在使用 JWT 的 asp.net 核心 web 应用和 web api 中使用谷歌身份验证