private void BeforeAccessNotification(Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCacheNotificationArgs args)
        {
            System.Diagnostics.Debug.WriteLine($"BeforeAccessNotification for {User}");

            // Look up the persisted entry
            var persistedEntry = LoadPersistedCacheEntry();

            if (CachedEntity == null)
            {
                // first time access
                CachedEntity = persistedEntry;
                System.Diagnostics.Debug.WriteLine($"BeforeAccessNotification for {User} - first time access");
            }
            else
            {
                // if the in-memory copy is older than the persistent copy
                if (persistedEntry != null && persistedEntry.LastWrite > CachedEntity.LastWrite)
                {
                    //// read from from storage, update in-memory copy
                    CachedEntity = persistedEntry;
                    System.Diagnostics.Debug.WriteLine($"BeforeAccessNotification for {User} - update in-memory cache");
                }
            }

            if (null != CachedEntity)
            {
                System.Diagnostics.Debug.WriteLine($"BeforeAccessNotification for {User} - Deserialize cached entity");
                this.Deserialize(CachedEntity.CacheBits);
            }
            else
            {
                System.Diagnostics.Debug.WriteLine($"BeforeAccessNotification for {User} - No cached entry exists");
                this.Deserialize(null);
            }
        }
        public AzureTableTokenCache(string user)
        {
            this.User         = user;
            this.AfterAccess  = AfterAccessNotification;
            this.BeforeAccess = BeforeAccessNotification;
            this.BeforeWrite  = BeforeWriteNotification;

            CachedEntity = LoadPersistedCacheEntry();
            this.Deserialize((CachedEntity == null) ? null : CachedEntity.CacheBits);
        }
        public override void Clear()
        {
            base.Clear();

            var entry = LoadPersistedCacheEntry();

            if (null != entry)
            {
                TableOperation delete = TableOperation.Delete(entry);
                tables.UserTokenCacheTable.Execute(delete);
            }
            CachedEntity = null;
        }
        private void AfterAccessNotification(Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCacheNotificationArgs args)
        {
            System.Diagnostics.Debug.WriteLine($"AfterAccessNotification for {User}");

            if (this.HasStateChanged)
            {
                if (CachedEntity == null)
                {
                    CachedEntity = new TokenCacheEntity();
                }
                CachedEntity.RowKey    = User;
                CachedEntity.CacheBits = this.Serialize();
                CachedEntity.LastWrite = DateTime.Now;

                TableOperation insert = TableOperation.InsertOrReplace(CachedEntity);
                tables.UserTokenCacheTable.Execute(insert);
                this.HasStateChanged = false;

                System.Diagnostics.Debug.WriteLine($"Wrote value to persistent cache for {User}");
            }
        }