OpenIddict令牌请求验证成功仍返回404 Not Found问题求助
排查OpenIddict客户端凭证流404问题
核心问题分析
从你的代码和现象来看,日志显示令牌请求已验证但返回404,主要是以下几个配置错误导致:
1. 重复调用AddAuthentication()导致配置丢失
你连续调用了两次services.AddAuthentication():
services.AddAuthentication(options => { options.DefaultAuthenticateScheme = "Identity.Application"; options.DefaultChallengeScheme = "Identity.Application"; options.DefaultSignInScheme = "Identity.Application"; }); services.AddAuthentication(); // 这行会重置之前的认证配置
第二次调用会清空你之前设置的默认Scheme,同时覆盖OpenIddict注册的认证中间件配置,导致请求无法被正确路由处理。
修复:删除第二次services.AddAuthentication()调用,保留第一次的配置(如果不需要Identity,建议调整默认Scheme为OpenIddict的认证Scheme)。
2. EnableTokenEndpointPassthrough()的误用
你启用了EnableTokenEndpointPassthrough(),这个选项的作用是让OpenIddict完成请求验证后,将请求传递给ASP.NET Core的MVC/Razor Pages管道处理,但你并没有编写对应/connect/token端点的控制器或处理逻辑,所以验证通过后找不到响应程序,返回404。
修复:如果你不需要自定义令牌端点处理逻辑,直接移除这个选项,让OpenIddict自动处理令牌响应:
options .UseAspNetCore(); // 移除.EnableTokenEndpointPassthrough();
3. 认证Scheme配置不匹配
客户端凭证流不需要依赖Identity.Application Scheme,你应该将默认认证Scheme设置为OpenIddict的认证Scheme,确保认证中间件能识别OpenIddict的处理:
services.AddAuthentication(options => { options.DefaultAuthenticateScheme = OpenIddictServerAspNetCoreDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIddictServerAspNetCoreDefaults.AuthenticationScheme; });
4. 中间件顺序错误(额外排查点)
确保你的中间件注册顺序正确,正确顺序应该是:
app.UseRouting(); app.UseAuthentication(); // 必须在UseRouting之后,UseAuthorization之前 app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
修复后的完整配置示例
services.AddDbContext<MyDbContext>(options => { options.UseOpenIddict(); }); services.AddOpenIddict() .AddCore(options => { options.UseEntityFrameworkCore() .UseDbContext<MyDbContext>(); }) .AddServer(options => { options.SetTokenEndpointUris("/connect/token"); options.AllowClientCredentialsFlow(); options.AddDevelopmentEncryptionCertificate() .AddDevelopmentSigningCertificate(); options.UseAspNetCore(); }); services.AddAuthentication(options => { options.DefaultAuthenticateScheme = OpenIddictServerAspNetCoreDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIddictServerAspNetCoreDefaults.AuthenticationScheme; }); services.AddAuthorization(); services.AddRouting(); services.AddControllers();
额外排查项
- 确认数据库中已正确添加客户端记录(包含
ClientId、ClientSecret,且明确允许客户端凭证流) - 检查请求的Content-Type是否为
application/x-www-form-urlencoded(客户端凭证流要求的标准格式) - 确保没有自定义路由规则覆盖了
/connect/token端点
内容的提问来源于stack exchange,提问作者Anish
相关产品推荐
相关产品推荐

