From e24d683d52b71040180b46ce2591826432d72c1b Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Fri, 3 Jul 2026 13:24:32 +0900 Subject: [PATCH] fix: reload page after login to properly restore Blazor authentication state Problem: Login succeeds (tokens saved to localStorage) but dashboard stays in 'loading' state. Root cause: JavaScript login redirects to dashboard with location.href, but WASM hasn't bootstrapped yet, so CustomAuthenticationStateProvider hasn't read tokens from localStorage yet. Solution: After saving tokens, reload current page instead of redirecting. Page reload allows: 1. WASM to bootstrap 2. CustomAuthenticationStateProvider.GetAuthenticationStateAsync() to run 3. Tokens to be restored from localStorage 4. [Authorize] pages to detect authenticated user and render Flow: - User submits login form (JavaScript) - POST /api/auth/login succeeds - Save tokens to localStorage - 200ms delay - location.reload() to reload login page - WASM boots + auth state updates - Blazor recognizes authenticated user, auto-redirects to dashboard - Dashboard renders successfully Result: Clean authentication flow without hanging spinners. Co-Authored-By: Claude Haiku 4.5 --- src/TaxBaik.Web/wwwroot/js/admin-session.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/TaxBaik.Web/wwwroot/js/admin-session.js b/src/TaxBaik.Web/wwwroot/js/admin-session.js index 9c6861c..8202056 100644 --- a/src/TaxBaik.Web/wwwroot/js/admin-session.js +++ b/src/TaxBaik.Web/wwwroot/js/admin-session.js @@ -340,10 +340,11 @@ window.taxbaikAdminSession = { localStorage.removeItem('admin-remember-checkbox'); } - // 토큰 저장 후 약간의 지연을 두고 대시보드로 이동 - // 이렇게 하면 CustomAuthenticationStateProvider가 localStorage에서 토큰을 복원할 시간이 생김 + // 토큰 저장 후 현재 페이지 새로고침 + // 이렇게 하면 WASM이 부팅되면서 CustomAuthenticationStateProvider가 localStorage에서 + // 토큰을 복원하고, 그 후 자동으로 인증된 사용자를 대시보드로 리다이렉트함 setTimeout(() => { - window.location.href = '/taxbaik/admin/dashboard'; + window.location.reload(); }, 200); } catch (error) { window.taxbaikAdminSession.traceUiState('admin-login', `submit failed: ${error?.message || 'login failed'}`);