【问题标题】:Action Filter is not working in asp.net core Web API操作过滤器在 asp.net 核心 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();
        });
    }
}

【问题讨论】:

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

标签: c# asp.net-core webapi


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 2021-02-01
相关资源
最近更新 更多