You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OpenIddict的Identity Server保护.NET API端点问题排查

解决IDX20803错误:正确配置Booking API验证OpenIddict Token

IDX20803错误的核心是JWT认证中间件无法从OpenIddict的配置端点获取元数据,下面是具体的解决步骤和排查要点:

一、正确配置Booking API的JWT认证中间件

如果是.NET 6+的Program.cs(或.NET 5及以下的Startup.cs),按以下方式配置:

1. 注册认证服务

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;

// 注册认证服务
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    // 指定Identity Server地址
    options.Authority = "http://localhost:5001";
    // 必须与OpenIddict中定义的API资源名称完全一致
    options.Audience = "booking-api";
    // 本地开发关闭HTTPS元数据要求,生产环境必须开启
    options.RequireHttpsMetadata = false;

    // 本地开发如果使用自签证书,添加证书忽略验证(生产环境禁用)
    options.BackchannelHttpHandler = new HttpClientHandler
    {
        ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
    };

    // 严格配置Token验证规则
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidIssuer = "http://localhost:5001",
        ValidateAudience = true,
        ValidAudience = "booking-api",
        ValidateLifetime = true, // 开启Token过期验证
        ClockSkew = TimeSpan.Zero // 关闭时钟偏差,严格校验过期时间
    };
});

// 注册授权服务
builder.Services.AddAuthorization();

2. 确保中间件顺序正确

中间件的加载顺序直接影响认证逻辑,必须保证UseAuthentication在UseAuthorization之前:

var app = builder.Build();

app.UseRouting();
// 先执行认证
app.UseAuthentication();
// 再执行授权
app.UseAuthorization();

app.MapControllers();

app.Run();

二、关键排查点

1. 验证Identity Server配置端点的可达性

直接在浏览器或Postman访问http://localhost:5001/.well-known/openid-configuration,确认能返回包含jwks_uri、issuer等字段的JSON数据。如果访问失败:

  • 检查Identity Server是否正常启动,端口是否为5001
  • 若使用Docker部署,需将localhost替换为host.docker.internal(容器内访问宿主机服务)

2. 检查OpenIddict的端点与资源配置

确保Identity Server中正确暴露了发现端点,并注册了booking-api资源:

// Identity Server的OpenIddict配置
builder.Services.AddOpenIddict()
    .AddServer(options =>
    {
        // 必须开启发现端点
        options.SetDiscoveryEndpointUris("/.well-known/openid-configuration");
        // 注册API资源
        options.RegisterScopes("booking-api");
        // 其他授权、Token端点配置...
        options.AddDevelopmentEncryptionCertificate()
               .AddDevelopmentSigningCertificate();
    });

3. 配置CORS允许跨域访问

如果Booking API与Identity Server存在跨域,需在Identity Server中添加CORS策略:

// Identity Server的CORS配置
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowBookingApi", policy =>
    {
        policy.WithOrigins("http://localhost:你的BookingAPI端口")
              .AllowAnyHeader()
              .AllowAnyMethod();
    });
});

// 加载CORS中间件
app.UseCors("AllowBookingApi");

4. 检查网络连通性

在Booking API所在环境(本地或服务器),用curl命令测试配置端点:

curl http://localhost:5001/.well-known/openid-configuration

若无法访问,排查防火墙、代理或网络路由问题。

三、测试验证

完成配置后,启动Identity Server和Booking API,用Next.js携带Bearer Token请求受保护端点,确认不再出现IDX20803错误,且Token的有效性、过期时间能被正确校验。

内容的提问来源于stack exchange,提问作者yasith rangana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:07:21