Release v21.0.2
Summary
Every observable-query transport (WebSocket, SSE, and the multiplexed hub) resolved the read-model interceptor from the root IServiceProvider. Chronicle's client services are registered scoped, resolving the current tenant's namespace once per scope and caching it — so resolving them from root cached whichever tenant subscribed first and reused that namespace for every subscription thereafter. In a multi-tenant app this meant [PII] properties on observable-query results came back empty for every tenant but the first.
Security
- Fix observable queries decrypting/releasing compliance and PII data under the wrong tenant's Chronicle namespace, which caused
[PII]properties to come back empty for every subscriber but whichever tenant's subscription resolved the namespace first (#2463)