using MesaFabApproval.Client.Services; using MesaFabApproval.Shared.Models; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.WebUtilities; using Microsoft.Extensions.Caching.Memory; 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] NavigationManager navigationManager { get; set; } [Inject] IMemoryCache cache { 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); } AuthTokens authTokens = await authService.GetAuthTokens(); if (authStateProvider.CurrentUser is not null && !string.IsNullOrWhiteSpace(_redirectPath)) { navigationManager.NavigateTo(_redirectPath); } else { await authStateProvider.Logout(); if (!string.IsNullOrWhiteSpace(_redirectPath)) { cache.Set("redirectUrl", _redirectPath); navigationManager.NavigateTo($"login?redirectPath={_redirectPath}"); } else { navigationManager.NavigateTo("login"); } } } catch (Exception ex) { await authStateProvider.Logout(); if (!string.IsNullOrWhiteSpace(_redirectPath)) { cache.Set("redirectUrl", _redirectPath); navigationManager.NavigateTo($"login?redirectPath={_redirectPath}"); } else { navigationManager.NavigateTo("login"); } } } }