Ocelot配置AuthenticationProviderKey后始终返回未授权错误
问题原因
你的配置存在两个核心问题,直接导致配置了认证的路由持续返回401未授权:
- 中间件执行顺序错误:你将ASP.NET Core原生的
UseAuthentication()、UseAuthorization()中间件放在了UseOcelot()之前执行。Ocelot的路由匹配、认证方案选择逻辑全部在自身中间件管道内实现,原生认证中间件执行时,请求还未经过Ocelot路由匹配,既识别不到当前路由配置的AuthenticationProviderKey = "TestKey"规则,又因为你注释掉了AddAuthentication中的默认认证方案配置,原生认证中间件会直接判定请求未认证,短路返回401,请求根本不会进入Ocelot的转发逻辑。 - AllowedScopes配置错误:Ocelot路由配置中
AllowedScopes传入空数组[]时,框架默认会开启scope校验逻辑,要求携带的JWT必须包含列表内配置的至少一个权限scope,空列表等价于没有任何允许访问的scope,即使token本身合法也会被拦截。如果当前不需要做scope粒度的权限校验,直接移除该配置项即可,不要传空数组。
另外你贴出的Ocelot配置JSON中,/api/gateway/notfication、/api/gateway/auth两个路由的UpstreamHttpMethod字段末尾多了冗余逗号,低版本JSON解析器会直接抛格式错误,你反馈其他路由可正常访问,应该是贴代码时的笔误,实际运行环境不存在该问题。
修复方案
- 调整Program.cs中的中间件顺序,将Ocelot中间件放在认证授权中间件之前:
// 其他前置中间件(如UseHttpsRedirection、UseCors等)按常规顺序放在最前面 await app.UseOcelot(); // 以下两个中间件仅对网关本地的Controller(比如健康检查、网关自身管理接口)生效,放在Ocelot之后即可 app.UseAuthentication(); app.UseAuthorization(); app.MapControllers();
- 修改Ocelot路由中的认证配置,移除空的AllowedScopes字段:
"AuthenticationOptions": { "AuthenticationProviderKey": "TestKey" }
- 如果确实需要保留原生认证中间件在Ocelot之前,就取消AddAuthentication中默认方案的注释,将默认scheme指定为
TestKey,但该方案会导致所有未配置Ocelot认证规则的路由也会被默认JWT认证拦截,非特殊场景不推荐使用。
内容的提问来源于stack exchange,提问作者Revan Zakaryali
相关产品推荐
相关产品推荐

