using MesaFabApproval.Client.Services; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.WebUtilities; using MudBlazor; using System.Security.Claims; namespace MesaFabApproval.Client.Pages; public partial class AuthenticatedRedirect { [Inject] MesaFabApprovalAuthStateProvider authStateProvider { get; set; } [Inject] IAuthenticationService authService { get; set; } [Inject] IUserService userService { get; set; } [Inject] ISnackbar snackbar { get; set; } [Inject] NavigationManager navigationManager { get; set; } private string? _jwt; private string? _refreshToken; private string? _redirectPath; protected override async Task OnParametersSetAsync() { try { Uri uri = navigationManager.ToAbsoluteUri(navigationManager.Uri); if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("jwt", out var jwt)) { _jwt = System.Net.WebUtility.UrlDecode(jwt); } if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("refreshToken", out var refreshToken)) { _refreshToken = System.Net.WebUtility.UrlDecode(refreshToken); } if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("redirectPath", out var redirectPath)) { _redirectPath = redirectPath.ToString(); } if (!string.IsNullOrWhiteSpace(_jwt) && !string.IsNullOrWhiteSpace(_refreshToken)) { await authService.SetTokens(_jwt, _refreshToken); ClaimsPrincipal principal = authService.GetClaimsPrincipalFromJwt(_jwt); string loginId = userService.GetLoginIdFromClaimsPrincipal(principal); await authService.ClearCurrentUser(); await authService.ClearTokens(); await authService.SetLoginId(loginId); await authService.SetTokens(_jwt, _refreshToken); await authService.SetCurrentUser(null); await authStateProvider.StateHasChanged(principal); } if (authStateProvider.CurrentUser is not null && !string.IsNullOrWhiteSpace(_redirectPath)) { navigationManager.NavigateTo(_redirectPath); } else { await authStateProvider.Logout(); if (!string.IsNullOrWhiteSpace(_redirectPath)) { navigationManager.NavigateTo($"login/{_redirectPath}"); } else { navigationManager.NavigateTo("login"); } } } catch (Exception ex) { await authStateProvider.Logout(); if (!string.IsNullOrWhiteSpace(_redirectPath)) { navigationManager.NavigateTo($"login/{_redirectPath}"); } else { navigationManager.NavigateTo("login"); } } } }