IdentityServer6自定义签名密钥存储后仍显示内置内存密钥解决方法
问题原因
默认内存密钥与自定义密钥同时出现在jwks文档中,由框架默认行为导致:
- IdentityServer6 默认开启自动密钥管理功能,该功能会在DI容器中注册一套内置的
ISigningCredentialStore和IValidationKeysStore实现,服务启动时自动生成一对内存临时签名密钥。 - 框架加载签名密钥时,会解析容器中所有注册的密钥Store实现,将所有Store返回的密钥合并后对外暴露,因此手动注册的自定义Store和默认自动密钥管理注册的内置Store会同时生效,最终返回两组共4个密钥。
- 如果代码中显式调用了
AddDeveloperSigningCredential()、AddTemporarySigningCredential()这类临时密钥扩展方法,也会额外注入独立的内存密钥源,进一步导致密钥冗余。
解决方法
按照以下步骤配置即可完全禁用默认密钥,仅保留自定义加载的密钥:
- 清理冗余的临时密钥注册代码
检查IdentityServer服务注册逻辑,删除所有AddDeveloperSigningCredential()、AddTemporarySigningCredential()方法调用,这类方法显式注入的内存密钥不会被后续自定义Store覆盖。 - 关闭框架默认自动密钥管理
在AddIdentityServer的配置委托中,将自动密钥管理开关设为关闭状态,阻止框架注册内置的密钥Store实现、自动生成临时内存密钥,示例代码如下:builder.Services.AddIdentityServer(options => { // 禁用默认自动密钥生成与管理逻辑 options.KeyManagement.Enabled = false; // 其余原有IdentityServer配置(如客户端、资源配置等)保持不变 }) // 保留原有的其他IdentityServer配置逻辑 ; - 保留原有自定义密钥Store的注册代码即可,无需修改:
builder.Services.AddSingleton<ISigningCredentialStore, MySigningCredentialStore>(); builder.Services.AddSingleton<IValidationKeysStore, MyValidationKeysStore>();
验证方式
重启应用后重新访问jwks发现文档,此时文档中将仅返回自定义Store加载的密钥,默认生成的内存密钥会被完全移除,密钥总数与自定义加载的密钥数量一致。
注意:生产环境使用自定义密钥管理时,需保证自定义加载的密钥符合所选签名算法的安全要求,私钥需做好安全存储避免泄露。
内容的提问来源于stack exchange,提问作者Tom Troughton
相关产品推荐
相关产品推荐

