diff --git a/src/client/Microsoft.Identity.Client/Cache/TokenCacheJsonSerializer.cs b/src/client/Microsoft.Identity.Client/Cache/TokenCacheJsonSerializer.cs index 2f0308a7c8..9f0d422ace 100644 --- a/src/client/Microsoft.Identity.Client/Cache/TokenCacheJsonSerializer.cs +++ b/src/client/Microsoft.Identity.Client/Cache/TokenCacheJsonSerializer.cs @@ -23,24 +23,29 @@ public TokenCacheJsonSerializer(ITokenCacheAccessor accessor) } public byte[] Serialize(IDictionary unknownNodes) + { + return Serialize(null, unknownNodes); + } + + public byte[] Serialize(string cacheKey, IDictionary unknownNodes) { var cache = new CacheSerializationContract(unknownNodes); - foreach (var token in _accessor.GetAllAccessTokens()) + foreach (var token in _accessor.GetAllAccessTokens(cacheKey)) { cache.AccessTokens[token.CacheKey] = token; } - foreach (var token in _accessor.GetAllRefreshTokens()) + foreach (var token in _accessor.GetAllRefreshTokens(cacheKey)) { cache.RefreshTokens[token.CacheKey] = token; } - foreach (var token in _accessor.GetAllIdTokens()) + foreach (var token in _accessor.GetAllIdTokens(cacheKey)) { cache.IdTokens[token.CacheKey] = token; } - foreach (var accountItem in _accessor.GetAllAccounts()) + foreach (var accountItem in _accessor.GetAllAccounts(cacheKey)) { cache.Accounts[accountItem.CacheKey] = accountItem; } diff --git a/src/client/Microsoft.Identity.Client/ITokenCacheInternal.cs b/src/client/Microsoft.Identity.Client/ITokenCacheInternal.cs index 3dd9fe6316..7250268b0b 100644 --- a/src/client/Microsoft.Identity.Client/ITokenCacheInternal.cs +++ b/src/client/Microsoft.Identity.Client/ITokenCacheInternal.cs @@ -12,7 +12,7 @@ namespace Microsoft.Identity.Client { - internal interface ITokenCacheInternal : ITokenCache, ITokenCacheSerializer + internal interface ITokenCacheInternal : ITokenCache, ITokenCacheSerializer, IPartitionedTokenCacheSerializer { OptionalSemaphoreSlim Semaphore { get; } ILegacyCachePersistence LegacyPersistence { get; } diff --git a/src/client/Microsoft.Identity.Client/ITokenCacheSerializer.cs b/src/client/Microsoft.Identity.Client/ITokenCacheSerializer.cs index 19310b4f54..5c2c54a18a 100644 --- a/src/client/Microsoft.Identity.Client/ITokenCacheSerializer.cs +++ b/src/client/Microsoft.Identity.Client/ITokenCacheSerializer.cs @@ -110,4 +110,23 @@ public interface ITokenCacheSerializer [EditorBrowsable(EditorBrowsableState.Never)] void DeserializeMsalV2(byte[] msalV2State); } + + /// + /// Similar to except accepts a cache partition to serialize into. + /// + public interface IPartitionedTokenCacheSerializer + { + /// + /// Similar to except serializes only the specified partition. + /// + /// + byte[] SerializeMsal(string cacheKey); + + /// + /// Similar to except doesn't clear the existing cache data. + /// + /// + + void DeserializeMsal(byte[] msalState); + } } diff --git a/src/client/Microsoft.Identity.Client/TokenCache.Serialization.cs b/src/client/Microsoft.Identity.Client/TokenCache.Serialization.cs index ace7986464..7a84dcaf20 100644 --- a/src/client/Microsoft.Identity.Client/TokenCache.Serialization.cs +++ b/src/client/Microsoft.Identity.Client/TokenCache.Serialization.cs @@ -53,5 +53,19 @@ void ITokenCacheSerializer.DeserializeMsalV3(byte[] msalV3State, bool shouldClea } _unknownNodes = new TokenCacheJsonSerializer(Accessor).Deserialize(msalV3State, shouldClearExistingCache); } + + byte[] IPartitionedTokenCacheSerializer.SerializeMsal(string cacheKey) + { + return new TokenCacheJsonSerializer(Accessor).Serialize(cacheKey, _unknownNodes); + } + + void IPartitionedTokenCacheSerializer.DeserializeMsal(byte[] msalState) + { + if (msalState == null || msalState.Length == 0) + { + return; + } + _unknownNodes = new TokenCacheJsonSerializer(Accessor).Deserialize(msalState, false); + } } }