【问题标题】:Asp.NET Core 3.1 middleware’s and authorization handlers orderAsp.NET Core 3.1 中间件和授权处理程序顺序
【发布时间】:2020-09-25 16:00:58
【问题描述】:

我有一个关于中间件和授权处理程序执行顺序的问题。在我的 ASP.NET Core 3.1 中,我按此顺序注册了中间件

  • A、UseAuthentication、UseAuthorisation、B、UseHealthChecks

但是当实际请求被执行时,我有这个命令

  • A,AuthenticationHandler,B,AuthorisationHandler

当我将注册中的 B 和健康检查的顺序更改为

  • A、UseAuthentication、UseAuthorisation、UseHealthChecks、B

执行请求时我有这个命令

  • A、AuthenticationHandler、AuthorisationHandler、B

有人可以解释为什么顺序是这样的吗?

更新: 我已经创建了测试仓库https://github.com/bigdnf/Playgraund2/blob/master/WebApplication6/WebApplication6/Startup.cs

但我发现了一件事。我的运行状况检查内部有 UseEndpoint,之后没有执行任何中间件,所以现在很清楚了。但现在的问题只是为什么在所有中间件之后执行授权中间件。我可以在它之后执行中间件还是这是 ASP.NET Core 中的设计?

【问题讨论】:

  • 能否请您发布有关您的 B 中间件的详细代码?我自己创建了一个测试演示,效果很好。
  • @BrandoZhang 我已经创建了测试仓库——有些事情现在很清楚,但还有一个问题。

标签: asp.net-core middleware asp.net-authorization asp.net-core-middleware


【解决方案1】:

根据您的测试项目,我发现您没有在 WeatherForecast 控制器中添加 Authorize 属性,这意味着 Authorize 中间件不会调用 AuthorisationHandler HandleRequirementAsync 来处理请求。

但是MVC过滤器会在C中间件之后调用HandleRequirementAsync方法。

您可以通过修改日志级别来跟踪它是如何工作的。

如果在 WeatherForecast 控制器中添加 Authorize 属性,您可以看到中间件在 C 之前执行 HandleRequirementAsync。

[ApiController]
[Route("[controller]")]
[Authorize("channel-policy")]
public class WeatherForecastController : ControllerBase

日志:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2022-01-25
    • 2022-11-16
    相关资源
    最近更新 更多