如何覆盖 [ValidateAntiForgeryToken] 返回的响应或手动验证令牌?

问题描述 投票:0回答:2

如果我对 API 方法使用

[ValidateAntiForgeryToken]
属性,我会得到自动生成的 HTTP400 JSON。我希望能够覆盖 JSON 内容。我可以以某种方式手动决定验证问题的响应内容吗?

我实现了自己的:

public class ExceptionFilteraaAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        System.Console.WriteLine(context);
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        if (context?.Exception != null)
        {
            context.Result = new ObjectResult(...)
            {
                StatusCode = (int)HttpStatusCode.InternalServerError,
            };
            context.ExceptionHandled = true;
        }
    }
}

但它永远不会到达这个地方,因为已经

[ValidateAntiForgeryToken]
响应了请求。


我需要实施:

public class ChangedAntiforgeryResultFilter : ResultFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext context)
    {
  
//this is never hit
    if (context?.Result is AntiforgeryValidationFailedResult)
    {
        context.Result = new BadRequestObjectResult(new LoginErrorResponseDto
        {
            OperationId = context.HttpContext.Features?.Get<RequestTelemetry>()?.Context?.Operation?.Id
        });
    }
}

public override void OnResultExecuted(ResultExecutedContext context)
{
}

}

并添加到我的控制器中,我的方法具有属性:

    [ValidateAntiForgeryToken]
    [ChangedAntiforgeryResultFilter]

我的

ChangedAntiForgeryResultFilter
从未达到,400以默认内容返回。

c# asp.net-core antiforgerytoken
2个回答
1
投票

可以通过复制默认的

ValidateAntiforgeryTokenAuthorizationFilter
来构建您自己的授权过滤器,替换它生成的结果。一种更简单的方法,不需要您重新实现验证逻辑,是除了默认的
[ValidateAntiForgeryToken]
之外添加一个结果过滤器,用于检查
AntiforgeryValidationFailedResult
并将其替换为其他内容。这样的过滤器看起来就像这样简单:

public class ChangedAntiforgeryResultFilter : IAlwaysRunResultFilter
{
    public void OnResultExecuting(ResultExecutingContext context)
    {
        if (context.Result is AntiforgeryValidationFailedResult)
        {
            context.Result = new StatusCodeResult(500);
        }
    }

    public void OnResultExecuted(ResultExecutedContext context)
    { }
}
[HttpPost]
[ValidateAntiForgeryToken]
[TypeFilter(typeof(ChangedAntiforgeryResultFilter))]
public IActionResult ExampleAction(ExampleModle model)
    => View(model);

话虽这么说,但我不建议更改响应代码。HTTP 状态代码 的定义非常精确。 4xx 错误意味着存在 client 错误,而 5xx 错误意味着存在 server 错误。客户端未发送正确的防伪令牌很大程度上是客户端错误。在这种情况下返回500内部服务器错误是错误的。

来自

AntiforgeryValidationFailedResult
的默认响应是 400 错误请求,这是此处的正确结果:

400(错误请求)状态代码表示服务器由于被认为是客户端错误的原因而无法或不会处理请求(例如,格式错误的请求语法、无效的请求消息帧或欺骗性的请求路由)。


0
投票

你成功了吗?

ChangedAntiforgeryResultFilter
中的示例不起作用。

我们将 Angular-App 从 .NET Framework 迁移到 ASP.NET Core 7。之前我们在失败的 XSRF 上得到了 http 403,但现在我们得到了一个通用的 http 400,没有任何提示。当用户在多个窗口中打开 Angular-App 并在一个窗口中进行登录更改时,由于 XSRF 故障,其他窗口应该重新加载,但我无法再可靠地检测到 XSRF 故障。

© www.soinside.com 2019 - 2024. All rights reserved.