.Net6环境下同一主机部署Identity Server与API后,携带令牌请求出现IDX20803错误的解决方法咨询
这个IDX20803错误我碰到过好多次了,本质就是你的API没法正确拉取Identity Server的配置元数据。结合你用IP部署在同一台机器的场景,咱们一步步排查解决:
解决IDX20803错误的具体步骤
1. 先确认API的Authority配置是否准确
你的API项目里,配置JWT验证时的Authority参数必须严格指向Identity Server的IP地址+端口,不能再用localhost了。举个例子,如果你的Identity Server发布在http://192.168.1.100:5000,那API的配置应该是这样:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "http://192.168.1.100:5000"; // 这里一定要是可访问的IP+端口 options.Audience = "your-api-resource-name"; // 替换成你的API资源名称 // 如果用的是HTTP而非HTTPS,必须加上这行,否则会拒绝请求元数据 options.RequireHttpsMetadata = false; });
注意:生产环境一定要用HTTPS,这里只是开发环境的临时解决方案。
2. 验证Identity Server的元数据端点是否能正常访问
直接在浏览器或者Postman里访问 http://<你的IdentityServerIP>:<端口>/.well-known/openid-configuration,看看能不能返回JSON格式的配置数据:
- 如果访问失败,说明Identity Server的发布配置有问题:检查它的Kestrel绑定是否允许所有IP访问,而不是只绑定localhost。比如在Program.cs里添加这段配置:
var builder = WebApplication.CreateBuilder(args); // 让Kestrel监听所有IP的指定端口 builder.WebHost.ConfigureKestrel(options => { options.ListenAnyIP(5000); // 替换成你的Identity Server端口 });
- 同时检查Windows防火墙或者杀毒软件有没有拦截这个端口,临时关闭防火墙试试能不能访问,要是能的话就给这个端口添加放行规则。
3. 核对令牌的Issuer与API的Authority是否一致
有时候你获取的令牌里,iss声明还是localhost,但API配置的是IP,这也会导致验证失败。你可以用JWT解码工具(比如本地命令行工具或离线解码网站)看看令牌里的iss字段值,必须和API的Authority完全一致。如果不一致,修改Identity Server的配置:
builder.Services.AddIdentityServer(options => { options.IssuerUri = "http://192.168.1.100:5000"; // 和API的Authority保持完全一致 }) .AddInMemoryClients(Config.Clients) .AddInMemoryApiResources(Config.ApiResources);
4. 测试API进程是否能访问Identity Server
有时候浏览器能访问,但API进程因为权限或代理问题没法连接。你可以在API里加一段测试代码,直接请求元数据端点:
var httpClient = new HttpClient(); try { var metadata = await httpClient.GetStringAsync("http://192.168.1.100:5000/.well-known/openid-configuration"); Console.WriteLine("元数据获取成功:" + metadata.Substring(0, 100)); } catch (Exception ex) { Console.WriteLine("请求失败:" + ex.Message); }
如果这段代码报错,说明API进程的网络访问有问题:比如用IIS发布的话,检查应用池身份有没有网络访问权限;或者有没有系统代理拦截了请求。
内容的提问来源于stack exchange,提问作者volkansolak
相关产品推荐
相关产品推荐

