using System.Diagnostics; using System.Security.Claims; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.Server; using Microsoft.AspNetCore.Components.Web; using timetracker.Shared; namespace timetracker.Server; public class PersistingServerAuthenticationStateProvider : ServerAuthenticationStateProvider, IDisposable { private readonly PersistentComponentState _state; private readonly PersistingComponentStateSubscription _subscription; public PersistingServerAuthenticationStateProvider(PersistentComponentState state) { _state = state; _subscription = state.RegisterOnPersisting(PersistAuthenticationState); } private async Task PersistAuthenticationState() { var authState = await GetAuthenticationStateAsync(); var user = authState.User; if (user.Identity?.IsAuthenticated == true) { var idClaim = user.FindFirst(ClaimTypes.NameIdentifier)?.Value; var name = user.Identity.Name; var isAdminClaim = user.FindFirst("IsTenantAdmin")?.Value; if (idClaim != null && name != null) { var userInfo = new UserInfo { Id = int.Parse(idClaim), Username = name, IsTenantAdmin = isAdminClaim == "true", IsAuthenticated = true }; _state.PersistAsJson("UserInfoState", userInfo); } } else { var userInfo = new UserInfo { IsAuthenticated = false }; _state.PersistAsJson("UserInfoState", userInfo); } } public void Dispose() { _subscription.Dispose(); } }