1 using Microsoft.Extensions.Logging;
3 using System.Collections.Generic;
21 readonly ILogger<IdentityCache>
logger;
35 this.asyncDelayer = asyncDelayer ??
throw new ArgumentNullException(nameof(asyncDelayer));
36 this.logger = logger ??
throw new ArgumentNullException(nameof(logger));
38 cachedIdentities =
new Dictionary<long, IdentityCacheObject>();
44 logger.LogTrace(
"Disposing...");
45 foreach (var I
in cachedIdentities.Select(x => x.Value).ToList())
53 throw new ArgumentNullException(nameof(user));
54 if (systemIdentity == null)
55 throw new ArgumentNullException(nameof(systemIdentity));
56 lock (cachedIdentities)
58 var uid = systemIdentity.
Uid;
59 logger.LogDebug(
"Caching system identity {0} of user {1}", uid, user.
Id);
61 if (cachedIdentities.TryGetValue(user.
Id.Value, out var identCache))
63 logger.LogTrace(
"Expiring previously cached identity...");
69 logger.LogDebug(
"Expiring system identity cache for user {1}", uid, user.
Id);
70 lock (cachedIdentities)
71 cachedIdentities.Remove(user.
Id.Value);
73 cachedIdentities.Add(user.
Id.Value, identCache);
81 throw new ArgumentNullException(nameof(user));
82 lock (cachedIdentities)
83 if (cachedIdentities.TryGetValue(user.
Id.Value, out var identity))
84 return identity.SystemIdentity.Clone();
85 throw new InvalidOperationException(
"Cached system identity has expired!");
Use server authentication
Represents a user on the current global::System.Runtime.InteropServices.OSPlatform ...
readonly Dictionary< long, IdentityCacheObject > cachedIdentities
The map of Api.Models.Internal.User.Ids to IdentityCacheObjects
For waiting asynchronously
IdentityCache(IAsyncDelayer asyncDelayer, ILogger< IdentityCache > logger)
Construct an IdentityCache
void CacheSystemIdentity(User user, ISystemIdentity systemIdentity, DateTimeOffset expiry)
Keep a user 's systemIdentity alive until an expiry time
long Id
The ID of the User
ISystemIdentity LoadCachedIdentity(User user)
Attempt to load a cached ISystemIdentity
ISystemIdentity Clone()
Clone the ISystemIdentity creating another copy that must have IDisposable.Dispose called on it ...
readonly ILogger< IdentityCache > logger
The ILogger for the IdentityCache
For keeping a specific ISystemIdentity alive for a period of time
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the IdentityCache
string Uid
A unique identifier for the user
For caching ISystemIdentitys