.NET Core的AddJwtBearer如何订阅OIDC提供商的证书变更
OIDC 提供商证书变更时 .NET Core JWT 校验的适配方案
首先需要纠正一个常见误区:AddJwtBearer 并不是仅会拉取一次 OIDC 元数据和签名密钥,框架本身已经内置了证书变更的适配机制,不需要额外做主动的变更订阅,常规场景下通过调整内置配置即可覆盖需求:
- 开启/调整自动刷新策略
你可以直接在AddJwtBearer的配置参数中调整两个核心配置项:AutomaticRefreshInterval:元数据定期刷新的时间间隔,默认值为 24 小时,你可以根据业务对证书变更的容忍度调低该值,例如设置为 1~2 小时,单位为TimeSpanRefreshOnIssuerKeyNotFound:该参数默认值为true,当收到的 JWT 用本地缓存的密钥校验失败、且触发「密钥不存在」的报错时,框架会立即主动拉取一次最新的 OIDC 元数据和签名密钥,再重新进行一次签名校验,这个机制可以覆盖绝大多数突然的证书轮转场景,不会导致合法的新签名令牌校验失败。
配置示例代码如下:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "你的OIDC服务提供商地址"; options.Audience = "当前API的受众标识"; // 调整定期刷新间隔为1小时 options.AutomaticRefreshInterval = TimeSpan.FromHours(1); // 确保校验失败时触发立即刷新 options.RefreshOnIssuerKeyNotFound = true; });
- 自定义变更通知逻辑(可选)
如果你需要在签名密钥发生变更时执行额外的自定义逻辑(例如上报告警、记录审计日志等),可以自己实现IConfigurationManager<OpenIdConnectConfiguration>接口,或者继承框架默认的ConfigurationManager<OpenIdConnectConfiguration>类,在配置更新的逻辑中插入自己的业务代码,再替换掉JwtBearerOptions中的默认ConfigurationManager实例即可。
注意:不要为了追求极致的实时性将刷新间隔设置得过短(例如小于5分钟),会给OIDC服务商带来不必要的请求压力,也会增加自身服务的校验耗时。绝大多数公有云OIDC服务的证书轮转都会预留新旧密钥共存的窗口期,默认的刷新策略已经足够平滑适配变更。
内容的提问来源于stack exchange,提问作者manura
相关产品推荐
相关产品推荐

