如何捕获自定义 IAuthorizationFilter 在我的自定义 ExceptionFilterAttribute 中引发的异常

How to catch an Exception thrown by a custom IAuthorizationFilter in my custom ExceptionFilterAttribute

提问人:Brent 提问时间:5/6/2023 更新时间:5/6/2023 访问量:122

问:

我在我的 api 控制器上有一个自定义来处理异常,以及在同一控制器上有一个自定义来处理自定义安全性。ExceptionFilterAttributeIAuthorizationFilter

捕获异常并且在大多数情况下工作正常,但是它不会捕获从我的 .这些异常只是被转储回原始用户,而从未命中异常属性。ExceptionFilterAttributeIAuthorizationFilter

有没有办法做到这一点?我尝试同时实现并指定首先处理 ExceptionFilterAttribute,但这似乎没有改变任何事情。IOrderedFilter

(这是 .NET 6 fwiw)

这是我所有控制器继承的控制器的来源:

[ExceptionHandling(Order = 1)]         // inherits ExceptionFilterAttribute
[EntityAuthorizationFilter(Order = 2)] // implements IAuthorizationFilter
public class ApiController : ControllerBase
{
}
asp.net asp.net-mvc 异常 custom-attributes asp.net-mvc-custom-filter

评论


答:

2赞 Adalyat Nazirov 5/6/2023 #1

根据此处的 Microsoft 文档:授权筛选器

  • 先运行
  • 确定用户是否有权执行请求
  • 如果请求未获得授权,则使管道短路

在这里

  • 不会处理异常
  • 异常筛选器不会处理异常

IAuthorizationFilter在每个 MVC 请求的任何其他筛选器之前执行。因此,如果它抛出异常或未经授权,它将使管道短路。

您可以尝试使用异常处理程序中间件,而不是此处所述的异常过滤器