public IDictionary <string, JToken> Deserialize(byte[] bytes, bool clearExistingCacheData) { List <KeyValuePair <string, IEnumerable <string> > > cacheKvpList; try { cacheKvpList = JsonHelper.DeserializeFromJson <List <KeyValuePair <string, IEnumerable <string> > > >(bytes); } catch (Exception ex) { throw new MsalClientException(MsalError.JsonParseError, MsalErrorMessage.TokenCacheDictionarySerializerFailedParse, ex); } var cacheDict = cacheKvpList.ToDictionary(x => x.Key, x => x.Value); if (clearExistingCacheData) { _accessor.Clear(); } if (cacheKvpList == null || cacheKvpList.Count == 0) { return(null); } if (cacheDict.ContainsKey(AccessTokenKey)) { foreach (var atItem in cacheDict[AccessTokenKey]) { _accessor.SaveAccessToken(MsalAccessTokenCacheItem.FromJsonString(atItem)); } } if (cacheDict.ContainsKey(RefreshTokenKey)) { foreach (var rtItem in cacheDict[RefreshTokenKey]) { _accessor.SaveRefreshToken(MsalRefreshTokenCacheItem.FromJsonString(rtItem)); } } if (cacheDict.ContainsKey(IdTokenKey)) { foreach (var idItem in cacheDict[IdTokenKey]) { _accessor.SaveIdToken(MsalIdTokenCacheItem.FromJsonString(idItem)); } } if (cacheDict.ContainsKey(AccountKey)) { foreach (var account in cacheDict[AccountKey]) { _accessor.SaveAccount(MsalAccountCacheItem.FromJsonString(account)); } } return(null); }
public static void WriteAdalRefreshToken( ILegacyCachePersistence legacyCachePersistence, MsalRefreshTokenCacheItem rtItem, MsalIdTokenCacheItem idItem, string authority, string uniqueId, string scope) { try { if (rtItem == null) { MsalLogger.Default.Info("No refresh token available. Skipping MSAL refresh token cache write"); return; } //Using scope instead of resource because that value does not exist. STS should return it. AdalTokenCacheKey key = new AdalTokenCacheKey(authority, scope, rtItem.ClientId, TokenSubjectType.User, uniqueId, idItem.IdToken.PreferredUsername); AdalResultWrapper wrapper = new AdalResultWrapper() { Result = new AdalResult(null, null, DateTimeOffset.MinValue) { UserInfo = new AdalUserInfo() { UniqueId = uniqueId, DisplayableId = idItem.IdToken.PreferredUsername } }, RefreshToken = rtItem.Secret, RawClientInfo = rtItem.RawClientInfo, //ResourceInResponse is needed to treat RT as an MRRT. See IsMultipleResourceRefreshToken //property in AdalResultWrapper and its usage. Stronger design would be for the STS to return resource //for which the token was issued as well on v2 endpoint. ResourceInResponse = scope }; IDictionary <AdalTokenCacheKey, AdalResultWrapper> dictionary = AdalCacheOperations.Deserialize(legacyCachePersistence.LoadCache()); dictionary[key] = wrapper; legacyCachePersistence.WriteCache(AdalCacheOperations.Serialize(dictionary)); } catch (Exception ex) { if (!string.Equals(rtItem?.Environment, idItem?.Environment, StringComparison.OrdinalIgnoreCase)) { MsalLogger.Default.Error(DifferentEnvError); } if (!string.Equals(rtItem?.Environment, new Uri(authority).Host, StringComparison.OrdinalIgnoreCase)) { MsalLogger.Default.Error(DifferentAuthorityError); } MsalLogger.Default.WarningPiiWithPrefix(ex, "An error occurred while writing MSAL refresh token to the cache in ADAL format. " + "For details please see https://aka.ms/net-cache-persistence-errors. "); } }
public static string GetKeyFromCachedItem(MsalIdTokenCacheItem idTokenCacheItem) { return(idTokenCacheItem.HomeAccountId); }