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

Npgsql集成安全连接PostgreSQL间歇性失败排查求助

根因分析
  • Kerberos密钥版本号(KVNO)变更:你贴出的PostgreSQL日志中Key table entry not found、kvno xx not found都是该问题的典型报错。PostgreSQL服务对应的服务主体名称(SPN)在KDC/AD中更新过密钥,KVNO自动升高,但故障应用池的进程内缓存了旧KVNO的服务票证,一直复用失效凭证发起认证。IIS应用池回收只是销毁线程和闲置资源,不会重置进程持有的Kerberos票证缓存,只有完全停止进程再重启,才会重新向KDC请求新的有效票证,所以只有完整重启应用池能恢复。
  • Kerberos票证续期失败:应用池运行身份的票证授予票证(TGT)过期后,Npgsql的GSS认证逻辑或者.NET Framework的NegotiateStream组件未正确处理TGT续期流程,导致认证上下文持续失效,所有新连接都会触发认证拒绝。
  • 跨应用不受影响的原因:每个IIS应用池对应独立的Windows进程,各自维护专属的Kerberos票证缓存,所以其他应用池的服务不受本次故障影响,和你观测到的现象完全匹配。
复现方法
  1. 先查询当前PostgreSQL服务SPN对应的KVNO值,记录当前版本号
  2. 在KDC/AD侧更新该SPN的密钥,触发KVNO版本号升高
  3. 不重启故障应用池,直接触发应用发起新的数据库连接请求,即可复现完全一致的报错
  4. 也可以手动清空故障应用池运行身份的本地Kerberos票证缓存,之后发起数据库连接也能触发该问题
临时规避方案

可以在连接字符串中增加KerberosServiceName参数,显式指定PostgreSQL服务的SPN,避免Npgsql自动推导SPN出错;如果仍偶发故障,可以配置定时任务在低峰期完整重启对应应用池,避免缓存的失效票证持续影响业务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:06:04