60 lines
1.8 KiB
C#
60 lines
1.8 KiB
C#
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();
|
|
}
|
|
}
|