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

能否将Identity Server 5中Enumerable.Empty<Client>替换为ConcurrentBag<Client>实现运行时添加客户端?

问题

使用appsettings.json文件配置客户端时,AddApiAuthorization()方法内部的AddClients()会先注册Enumerable.Empty<Client>(),再从配置文件添加客户端,对应代码为:

builder.AddInMemoryClients(Enumerable.Empty<Client>());

请问是否可以将此处的Enumerable.Empty<Client>替换为ConcurrentBag<Client>,以实现运行时添加客户端?

回答

直接替换成ConcurrentBag<Client>大概率行不通,核心原因在于AddInMemoryClients()的设计逻辑:

  • 存储逻辑限制:AddInMemoryClients()接受IEnumerable<Client>参数,但内部会将传入的集合内容拷贝到固定的内存存储中,后续不会再监听原集合的变化。哪怕你传入ConcurrentBag<Client>,后续往里面新增客户端,认证服务也无法感知到——因为它仅在初始化阶段读取一次集合数据。
  • 核心需求不匹配:ConcurrentBag<Client>解决的是多线程下集合的读写安全问题,但你要实现的运行时动态添加客户端,本质是需要认证系统支持配置的动态刷新,而默认的内存客户端存储并不具备这个能力。

如果要实现运行时动态添加客户端,正确的思路是自定义客户端存储:

  • 实现IClientStore接口,在接口实现中对接支持动态读写的数据源(比如数据库、分布式缓存)
  • 用自定义的IClientStore替代默认的内存实现
  • 可额外添加缓存刷新逻辑,平衡性能与配置实时性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:24:57