动作筛选器在asp.net核心Web API中不起作用

时间:2020-07-23 15:59:14

标签: c# asp.net-core webapi

我已经在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 个答案:

答案 0 :(得分:0)

ActionFilterAttribute抽象类包含以下方法来覆盖:

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

ActionExecutingContext中使用OnActionExecuting

只需要修改OnActionExecuting中的CustomAuthorize。其他代码与u。

        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);

        }

结果测试

enter image description here