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

IdentityServer4认证时自定义Grant存储未被调用该如何配置

解决方案

问题根源

IdentityServer4 4.x版本默认采用统一的IPersistedGrantStore处理所有持久化授权类数据,你单独注册的IAuthorizationCodeStore、IRefreshTokenStore等细分存储接口,在默认配置下不会被调度,IdentityServer会优先使用默认的内存IPersistedGrantStore实现,这也是日志提示使用内存授权存储的原因。


两种适配方案

方案1:实现统一IPersistedGrantStore(官方推荐)

适合所有授权数据存储在同一介质的场景,仅需实现一个接口即可覆盖所有授权类数据的存储逻辑,无需单独维护多份存储实现。

操作步骤:

  1. 自定义类实现IPersistedGrantStore接口,完成StoreAsync、GetAsync、GetAllAsync、RemoveAsync、RemoveAllAsync五个方法的业务逻辑,将你之前写的Redis、Azure Table存储逻辑迁移到对应方法中。
  2. 在ConfigureServices中注册自定义实现,替换默认内存存储,删除你之前单独注册的四个细分存储接口的代码:
// 注册自定义统一持久化授权存储
builder.AddPersistedGrantStore<你的自定义IPersistedGrantStore实现类>();
  1. 重启服务后日志将不再提示使用内存授权存储,所有授权数据都会走你自定义的存储逻辑。

方案2:保留已实现的细分存储接口

如果你需要将不同授权数据存在不同存储介质,希望复用已经实现的四个细分存储接口,只需额外注册调度服务即可:

// 保留你原有注册的4个细分存储接口的代码,新增下面这行注册调度服务
builder.Services.AddTransient<IPersistedGrantService, DefaultPersistedGrantService>();

DefaultPersistedGrantService会自动识别你注册的各个细分存储接口,按业务需求调度对应存储实现,不再走统一IPersistedGrantStore逻辑。


概念说明
  • IPersistedGrantStore:是统一的存储抽象层,设计目的是简化存储适配成本,大多数场景下只需要实现这一个接口就能满足所有授权数据的存储需求,是IdentityServer默认优先使用的存储入口。
  • 细分存储接口(IAuthorizationCodeStore/IRefreshTokenStore等):是为复杂场景设计的拆分存储抽象,适合不同授权数据需要分散存储的业务需求。
  • IPersistedGrantService:是业务调度层,负责根据当前操作的授权数据类型,匹配对应的存储实现进行调用。如果使用统一IPersistedGrantStore模式,默认调度服务会直接调用统一存储接口;如果要使用细分存储接口,就需要注册DefaultPersistedGrantService,它会自动匹配你注册的所有细分存储实现完成调度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:48:01