IdentityServer 4签名证书轮换后无法获取OpenID发现文档的问题咨询
1. 删除PersistentGrants表记录恢复系统是否正常?
这绝对不属于正常情况。PersistentGrants表的作用是存储刷新令牌、授权码、设备代码这类持久化的授权数据,它和OpenID发现文档的生成/返回没有直接关联。删除记录后系统恢复,大概率是因为这个操作间接触发了缓存清理,或者存在某条异常的授权记录——比如旧证书过期后,IdentityServer加载该记录时尝试调用已过期的证书引发未捕获异常,进而导致发现文档端点无法正常响应。
正常情况下,只要你提前配置了新旧证书的验证逻辑(就像你代码里做的AddSigningCredential+AddValidationKey),即使存在旧的授权数据,系统也应该能正常处理,完全不需要删除这些用户的授权记录。
2. 如果是缓存问题,该如何修复?
缓存确实是这类证书轮换问题的高发点,你可以从以下几个维度排查修复:
(1)IdentityServer自身的发现文档缓存
IdentityServer默认会缓存发现文档内容,你可以调整配置缩短缓存时长,或者强制刷新:
- 在
AddIdentityServer时,通过options.Discovery.CacheDuration设置更短的缓存时间,比如:services.AddIdentityServer(options => { options.Discovery.CacheDuration = TimeSpan.FromMinutes(5); }) - 证书轮换完成后,直接重启IdentityServer的IIS应用池,彻底清除内存中的旧缓存。
(2)客户端应用的配置缓存
客户端使用的ConfigurationManager<OpenIdConnectConfiguration>默认会缓存发现文档30分钟,你可以:
- 在客户端的
AddOpenIdConnect配置中,缩短刷新间隔:options.ConfigurationManager = new ConfigurationManager<OpenIdConnectConfiguration>( options.MetadataAddress, new OpenIdConnectConfigurationRetriever(), new HttpDocumentRetriever()) { RefreshInterval = TimeSpan.FromMinutes(5) }; - 证书轮换后,主动在客户端代码中调用
configurationManager.RequestRefreshAsync()强制刷新配置; - 重启所有客户端应用,清除内存中的旧证书配置缓存。
(3)IIS输出缓存
如果你的IIS站点配置了输出缓存,可能会缓存旧的发现文档内容:
- 检查IIS站点的「输出缓存」设置,确保
.well-known/openid-configuration端点被排除在缓存之外; - 证书轮换后,手动清除IIS的缓存(可以通过IIS管理器的「缓存」功能,或者执行
iisreset命令重启IIS)。
(4)Windows证书缓存
Windows系统和IIS可能会缓存证书信息,你可以:
- 执行
iisreset重启IIS服务,清除证书相关的系统缓存; - 确认新证书的权限:右键证书→「所有任务」→「管理私钥」,给IdentityServer应用池的运行账户(比如
ApplicationPoolIdentity)添加读取权限,避免因权限问题导致证书加载失败。
3. 是否需要提前一周以上在发现文档中添加两个证书?
提前一周添加新旧证书是非常稳妥的做法,但具体时间窗口取决于客户端的发现文档缓存周期:
- 如果客户端的缓存周期是30分钟,提前几个小时就足够让所有客户端获取到包含双证书的发现文档;
- 如果客户端的缓存周期较长(比如1天),提前1-2天就足够覆盖所有场景。
核心目的是:在旧证书过期前,确保所有客户端都已经拿到包含新旧证书公钥的发现文档,这样客户端就能提前信任新证书,避免切换时出现验证或配置获取失败的问题。你之前提前一周的操作是没问题的,不需要再延长时间,重点是要确保证书配置生效后,发现文档确实包含了两个证书的jwks(JSON Web Key Set)信息——可以直接访问发现文档地址,检查jwks_uri返回的内容是否包含新旧证书的公钥。
额外排查建议
你可以直接访问https://oursite.com/ouridp/.well-known/openid-configuration,看是否能正常返回内容:
- 如果返回500错误,查看IdentityServer的日志(比如Windows事件查看器、或者你配置的日志文件),找到具体的异常信息——这比只看客户端的IDX20803报错更能定位根本问题,比如是否是证书加载失败、数据库配置异常等。
内容的提问来源于stack exchange,提问作者Hitzkopf

