您似乎误解了端点路由的工作原理。端点路由运行两个中间件:routing中间件,调用者app.UseRouting()
,以及endpoint中间件,调用者app.UseEndpoints(…)
.
路由中间件首先运行,它的工作本质上是找出正在请求的端点。它使用请求中的信息来解决这个问题。完成后,它会保存该信息以供以后使用。它实际上不产生任何输出。
在路由中间件之后,您将需要运行其他可以利用端点信息的中间件。例如,授权中间件可以进行检查以确定用户是否有权访问所请求的端点。
最后,端点中间件运行。当它发生时,它会only运行路由中间件确定要运行的端点。您在中配置的所有其他端点UseEndpoints(…)
呼叫被忽略。
端点中间件通常被期望是最后运行的中间件,因为通常您希望它能够实际响应请求,无论系统请求什么(MVC、SignalR,等等)。
所以是的,你can use UseEndpoints(…)
多次,但它可能不会执行您期望的操作。所有配置委托传递给UseEndpoints
组合起来指定什么UseRouting()
实际上会做。所以多次调用UseEndpoints
都将只配置单个路由中间件。然后,当第一个端点中间件执行时,它将执行所请求的任何端点——无论该端点是否在该确切的配置中配置。UseEndpoints
call.
这意味着多次调用UseEndpoints(…)
几乎总是表明您做错了什么。在您的情况下,通过拆分端点配置,您实际上无法拆分某些中间件需要完成的工作。所以你的SetUser
实际上永远不会为任一端点运行,因为它位于某些端点中间件之后。
如果你想真正避免打电话SetUser
对于某些路由,那么您实际上应该利用端点路由为您提供的信息并让您的中间件有条件地运行。您可以获得决定Endpoint https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.endpoint?view=aspnetcore-3.0 using httpContext.GetEndpoint()
然后浏览其元数据来决定是否需要执行某些操作。
话虽如此,如果您的目标是使用给定身份对用户进行身份验证,那么您最好使用例如cookie 身份验证,然后直接登录主体。这样您就可以在身份验证堆栈之上进行构建。