Asp.net core Asp.NET核心3.1中间件&x2019;s和授权处理程序命令

Asp.net core Asp.NET核心3.1中间件&x2019;s和授权处理程序命令,asp.net-core,middleware,asp.net-authorization,asp.net-core-middleware,Asp.net Core,Middleware,Asp.net Authorization,Asp.net Core Middleware,我有一个关于中间件和授权处理程序执行顺序的问题。在我的ASP.NET Core 3.1中,我已按该顺序注册了中间件 A、 使用认证、使用授权、B、使用健康检查 但当实际请求被执行时,我有这个命令 A、 AuthenticationHandler,B,AuthorizationHandler 当我将B和healthcheck登记顺序更改为 A、 使用认证,使用授权,使用健康检查,B 当执行请求时,我有这个命令 A、 AuthenticationHandler,Authorizatio

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

  • A、 使用认证、使用授权、B、使用健康检查
但当实际请求被执行时,我有这个命令

  • A、 AuthenticationHandler,B,AuthorizationHandler
当我将B和healthcheck登记顺序更改为

  • A、 使用认证,使用授权,使用健康检查,B
当执行请求时,我有这个命令

  • A、 AuthenticationHandler,AuthorizationHandler,B
有人能解释为什么秩序是这样的吗

更新: 我已经创建了测试回购


但我发现了一件事。我的healthcheck在内部使用了Endpoint,之后没有执行任何中间件,所以现在已经很清楚了。但现在的问题只是为什么授权中间件在所有中间件之后执行。我可以在它之后执行中间件吗?或者这是在ASP.NET Core中设计的?

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

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

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

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

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


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

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

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

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

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


能否请您发布有关B中间件的详细代码?我已经在我这边创建了一个测试演示,效果很好。@BrandoZhang我已经创建了test repo-现在有些事情已经清楚了,但是还有一个问题。你可以发布关于你的B中间件的详细代码吗?我已经在我这边创建了一个测试演示,效果很好。@BrandoZhang我已经创建了测试报告-现在有些事情已经很清楚了,但还有一个问题。