using KWWebInvApp.Data; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage; using System.Security.Claims; namespace KWWebInvApp.Services { public class WebAuthenticationStateProvider : AuthenticationStateProvider { private readonly IAuthenticationService _authService; private readonly ProtectedSessionStorage _sessionStorage; public WebAuthenticationStateProvider(IAuthenticationService authService, ProtectedSessionStorage sessionStorage) { _authService = authService; _sessionStorage = sessionStorage; } /* public override async Task GetAuthenticationStateAsync() { var user = await _authService.GetAuthenticatedUserAsync(); if (user == null) return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())); var claims = new List { new Claim(ClaimTypes.Name, user.username), new Claim(ClaimTypes.Role, user.userlvl.ToString()) // Add any other claims based on your application's requirements }; var identity = new ClaimsIdentity(claims, "CustomAuth"); var principal = new ClaimsPrincipal(identity); return new AuthenticationState(principal); } public override async Task GetAuthenticationStateAsync() { var principal = new ClaimsPrincipal(new ClaimsIdentity()); UserInfoServices.userinfo? user = null; try { var userSessionResult = await _sessionStorage.GetAsync("UserInfoSession"); user = (userSessionResult.Success) ? userSessionResult.Value : null; if (user == null) return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())); var claims = new List { new Claim(ClaimTypes.Name, user.username), new Claim(ClaimTypes.Role, user.userlvl.ToString()) // Add any other claims based on your application's requirements }; var identity = new ClaimsIdentity(claims, "KWWebInvAppAuth"); principal = new ClaimsPrincipal(identity); } catch { return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())); } var authState = new AuthenticationState(principal); return authState; } */ public override async Task GetAuthenticationStateAsync() { var principal = new ClaimsPrincipal(new ClaimsIdentity()); UserInfoServices.userinfo? user = null; try { user = await _authService.GetAuthenticatedUserAsync(); if (user == null) { var userSessionResult = await _sessionStorage.GetAsync("UserInfoSession"); user = (userSessionResult.Success) ? userSessionResult.Value : null; if (user == null) return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())); else await _authService.SetAuthenticatedUserAsync(user); } var claims = new List { new Claim(ClaimTypes.Name, user.username), new Claim(ClaimTypes.Role, user.userlvl.ToString()) // Add any other claims based on your application's requirements }; var identity = new ClaimsIdentity(claims, "KWWebInvAppAuth"); principal = new ClaimsPrincipal(identity); } catch { return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())); } return new AuthenticationState(principal); } public async Task LoginAsync(LoginData loginData) { bool loginSuccess = await _authService.LoginAsync(loginData); if(loginSuccess) { UserInfoServices.userinfo user = await _authService.GetAuthenticatedUserAsync(); // Supply sessionStorage with user data first before using SetAuthenticationState. // authState will rely on the value of UserInfoSession stored here await _sessionStorage.SetAsync("UserInfoSession", user); AuthenticationState authState = await GetAuthenticationStateAsync(); SetAuthenticationState(authState); } return loginSuccess; } public async Task LogoutAsync() { await _authService.LogoutAsync(); await _sessionStorage.DeleteAsync("UserInfoSession"); SetAuthenticationState(new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()))); } public void SetAuthenticationState(AuthenticationState authState) { NotifyAuthenticationStateChanged(Task.FromResult(authState)); } } }