【问题标题】:Action Filter Unable To Block An Unauthorized Request in Controller操作过滤器无法阻止控制器中的未经授权的请求
【发布时间】:2022-01-11 12:49:41
【问题描述】:

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

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() 放在自定义属性类中的特定控制器中使用该属性时,它起作用并得到确认。但不幸的是,它不会在控制器级别引发任何异常。我做了如下操作:

请求

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

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

【问题讨论】:

    标签: c# .net-core asp.net-core-webapi .net-core-3.1


    【解决方案1】:

    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)
        {
            
        }
    } 
    

    【讨论】:

    • 这很好用@Xinran Shen。非常感谢,但是当有一个有效的标头值时,它会引发相同的异常。虽然不应该,对吧?
    • @user8512043 当有一个无效的标头时,它会抛出一个异常,它在邮递员中响应400code。但是当有一个有效的标头值时,请求将进入动作,因为你的GetAllTeams()动作中的代码return Ok(Token),所以动作将返回token,这不是例外,你可以看到它响应@ 987654331@邮递员代码。
    • 好的。当有一个有效的令牌时,它仍然显示相同的消息。看到这个-ibb.co/Y4gmK31。使用 vs code 和 rest 客户端应用测试 api。
    • HI.当您发送带有有效标头值的请求时,您能否在var Authorization =context.HttpContext.Request.Headers["test"] 中获取Authorization 的值?
    • 是的,完美解决 - ibb.co/L9x9Dkt。我可以看到你的情况,它适用于 Postman,
    猜你喜欢
    • 2014-07-03
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多