Owin舞台标记

鉴于这在我的应用程序启动…

app.Use((context, next) => { return next.Invoke(); }).UseStageMarker(PipelineStage.PostAuthenticate); app.Use((context, next) => { return next.Invoke(); }).UseStageMarker(PipelineStage.Authenticate); 

…为什么PostAuthenticate代码在Authenticate代码之前执行?

我不是说“为什么第一个app.use在第二个app.use之前被调用”我的意思是:为什么第一个调用会在第二个调用之前调用,因为第二个应该在请求管道中更早发生?

编辑

与此问题相关: 如何在此代码中获取Windows标识?

它是按照设计,根据文档: https : //www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline 。

阶段标记规则部分,您可以阅读以下内容:

OWIN管道和IIS管道是有序的,因此必须按顺序调用app.UseStageMarker 。 您无法将事件处理程序设置为在向app.UseStageMarker注册的最后一个事件之前的事件。 例如, 致电之后

 app.UseStageMarker(PipelineStage.Authorize); 

调用app.UseStageMarker传递AuthenticatePostAuthenticate将不受尊重,并且不会抛出任何exception。 Owin中间件组件(OMC)在最新阶段运行,默认情况下为PreHandlerExecute 。 舞台标记用于使它们更早运行。 如果您不按顺序指定阶段标记,我们将舍入到较早的标记。 换句话说,添加一个舞台标记说“不晚于第十阶段运行”。 OMC在OWIN管道中添加了最早的阶段标记。

似乎与IIS中的文档事件相反,它们按照它们的配置顺序被连接和处理,而不是按照它们应该出现在请求生命周期中的顺序。

这感觉就像是owin请求生命周期中的一个错误,但是嘿,我的问题解决了。