/// <summary> /// Creates a new instance of <see cref="MsalCacheHelper"/>. To configure MSAL to use this cache persistence, call <see cref="RegisterCache(ITokenCache)"/> /// </summary> /// <param name="storageCreationProperties">Properties to use when creating storage on disk.</param> /// <param name="logger">Passing null uses a default logger</param> /// <returns>A new instance of <see cref="MsalCacheHelper"/>.</returns> public static async Task <MsalCacheHelper> CreateAsync(StorageCreationProperties storageCreationProperties, TraceSource logger = null) { if (storageCreationProperties is null) { throw new ArgumentNullException(nameof(storageCreationProperties)); } // We want CrossPlatLock around this operation so that we don't have a race against first read of the file and creating the watcher using (CreateCrossPlatLock(storageCreationProperties)) { // Cache the list of accounts var ts = logger == null ? s_staticLogger.Value : new TraceSourceLogger(logger); var accountIdentifiers = await GetAccountIdentifiersAsync(storageCreationProperties, ts).ConfigureAwait(false); var cacheWatcher = new FileSystemWatcher(storageCreationProperties.CacheDirectory, storageCreationProperties.CacheFileName); var helper = new MsalCacheHelper(storageCreationProperties, logger, accountIdentifiers, cacheWatcher); try { cacheWatcher.EnableRaisingEvents = true; } catch (PlatformNotSupportedException) { helper._logger.LogError( "Cannot fire the CacheChanged event because the target framework does not support FileSystemWatcher. " + "This is a known issue in Xamarin / Mono."); } return(helper); } }
/// <summary> /// Creates a new instance of <see cref="MsalCacheHelper"/>. /// </summary> /// <param name="storageCreationProperties">Properties to use when creating storage on disk.</param> /// <param name="logger">Passing null uses a default logger</param> /// <returns>A new instance of <see cref="MsalCacheHelper"/>.</returns> public static async Task <MsalCacheHelper> CreateAsync(StorageCreationProperties storageCreationProperties, TraceSource logger = null) { // We want CrossPlatLock around this operation so that we don't have a race against first read of the file and creating the watcher using (CreateCrossPlatLock(storageCreationProperties)) { // Cache the list of accounts var accountIdentifiers = await GetAccountIdentifiersAsync(storageCreationProperties).ConfigureAwait(false); var cacheWatcher = new FileSystemWatcher(storageCreationProperties.CacheDirectory, storageCreationProperties.CacheFileName); var helper = new MsalCacheHelper(storageCreationProperties, logger, accountIdentifiers, cacheWatcher); cacheWatcher.EnableRaisingEvents = true; return(helper); } }