操作过滤器无法阻止控制器中的未经授权的请求

Action Filter Unable To Block An Unauthorized Request in Controller

我试图阻止控制器中的请求,如果它在 header 中没有特定值。所以我使用一些指导方针做了以下事情:

public class InvalidTokenAttribute : Attribute, IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        var Authorization = context.HttpContext.Request.Headers["test"];

        if (Authorization != "12345678910")
        {
            context.ModelState.AddModelError("Authorization", "Authorization failed!");
        }
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        
    }
} 

当我在特定控制器中使用属性并将 Console.WriteLine() 放入自定义属性 class 时,它起作用并得到确认。但不幸的是,它不会在控制器级别抛出任何异常。我做了如下事情:

请求:

GET http://localhost:PortNo/WeatherForecast/GetAllTeams
test: "12345678"

控制器:

[HttpGet]
[InvalidToken]
public async Task<ActionResult<IEnumerable<TeamDetails>>> GetAllTeams()
{
    string Token = Request.Headers["test"];
  
    return Ok(Token);
}

使用该属性,它不应进入控制器,因为 header 值无效或不匹配。不幸的是,值在控制器中返回并显示输出。有什么我错过的吗?

Authorization != "12345678910"时,你的动作过滤器只是添加一个ModelError,它不会中断请求。所以,如果你不想让它进入控制器,你可以添加一些代码,如:

过滤器

public class InvalidTokenAttribute : Attribute, IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        var Authorization = context.HttpContext.Request.Headers["test"];

        if (Authorization != "12345678910")
        {
            context.ModelState.AddModelError("Authorization", "Authorization failed!");
            //you can add this code to Interrupt request,So request will not get into controller
            context.Result = new BadRequestObjectResult(context.ModelState);
        }
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        
    }
}