能否将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
相关产品推荐
相关产品推荐

