using System.Security.Claims; using Yi.Framework.Infrastructure.Utils; namespace Yi.Framework.Infrastructure.CurrentUsers.Accessor { public abstract class CurrentPrincipalAccessorBase : ICurrentPrincipalAccessor { public ClaimsPrincipal Principal => _currentPrincipal.Value ?? GetClaimsPrincipal(); private readonly AsyncLocal _currentPrincipal = new AsyncLocal(); protected abstract ClaimsPrincipal GetClaimsPrincipal(); public virtual IDisposable Change(ClaimsPrincipal principal) { return SetCurrent(principal); } private IDisposable SetCurrent(ClaimsPrincipal principal) { var parent = Principal; _currentPrincipal.Value = principal; return new DisposeAction, ClaimsPrincipal>>(static (state) => { var (currentPrincipal, parent) = state; currentPrincipal.Value = parent; }, (_currentPrincipal, parent)); } } }