C#离线无法访问AuthServer时实例化OpenIdConnectConfiguration无signingKeys问题
问题根因
OpenIdConnectConfiguration.Create()方法仅解析传入的OIDC发现接口JSON的原生字段,不会自动拉取jwks_uri对应的公钥集合,你仅持久化了.well-known/openid-configuration的返回内容,没有同步存储JWKS公钥数据,所以SigningKeys属性为空,属于预期行为,和你的实现思路无关。
完整实现方案
第一步:首次拉取时持久化两份数据
访问授权服务器获取配置时,需要同时存储两类公开数据:
.well-known/openid-configuration返回的完整JSON- 上述JSON中
jwks_uri字段对应接口返回的JWKS公钥集合JSON
可以根据业务场景存储到本地文件、分布式缓存或者数据库中。
第二步:本地初始化配置的代码实现
using Microsoft.IdentityModel.Protocols.OpenIdConnect; using Microsoft.IdentityModel.Tokens; using System.IO; // 读取本地持久化的两份数据 string oidcConfigContent = File.ReadAllText("local-oidc-config.json"); string jwksContent = File.ReadAllText("local-jwks.json"); // 初始化基础OIDC配置 var openIdConfig = OpenIdConnectConfiguration.Create(oidcConfigContent); // 手动注入签名公钥 var jwks = new JsonWebKeySet(jwksContent); foreach (var signingKey in jwks.GetSigningKeys()) { openIdConfig.SigningKeys.Add(signingKey); }
第三步:定期更新本地存储
按照你预设的校验周期,定期从授权服务器拉取最新的OIDC配置和JWKS覆盖本地存储即可,兼容公钥轮换的场景。
场景适配说明
- 前端持有有效刷新令牌的验签场景:用上述生成的
openIdConfig直接做JWT验签,无需访问授权服务器 - 后端服务重启场景:启动时直接读取本地文件初始化配置,不依赖授权服务器的可用性
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

