diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Login.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Login.razor
index fe0710b..1524f6c 100644
--- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Login.razor
+++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Login.razor
@@ -1,6 +1,6 @@
@page "/admin/login"
@layout TaxBaik.WasmClient.Components.Admin.Layout.BlankLayout
@attribute [AllowAnonymous]
-@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
+@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: true))
로그인
-
+
diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminLoginFormNative.razor b/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminLoginFormNative.razor
deleted file mode 100644
index 07d40b6..0000000
--- a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminLoginFormNative.razor
+++ /dev/null
@@ -1,141 +0,0 @@
-@using System.Text.Json
-@inject ILocalStorageService LocalStorageService
-@inject NavigationManager Navigation
-@inject ISnackbar Snackbar
-@inject HttpClient Http
-@inject AuthenticationStateProvider AuthStateProvider
-
-
-
- 관리자 로그인
-
-
-
-
-
-
-
-
-
-
-
- @(isLoggingIn ? "로그인 중..." : "로그인")
-
-
-
-
-
-@code {
- private MudForm? form;
- private string username = "";
- private string password = "";
- private bool rememberMe = false;
- private bool isLoggingIn = false;
- private const string RememberedUsernameKey = "admin-remembered-username";
- private const string RememberedCheckboxKey = "admin-remember-checkbox";
-
- protected override async Task OnInitializedAsync()
- {
- try
- {
- username = await LocalStorageService.GetItemAsStringAsync(RememberedUsernameKey) ?? "";
- var checkboxValue = await LocalStorageService.GetItemAsStringAsync(RememberedCheckboxKey) ?? "false";
- rememberMe = checkboxValue == "true" && !string.IsNullOrEmpty(username);
- }
- catch
- {
- username = "";
- rememberMe = false;
- }
- }
-
- private async Task HandleLogin()
- {
- if (form == null || isLoggingIn) return;
-
- await form.Validate();
- if (!form.IsValid) return;
-
- isLoggingIn = true;
- try
- {
- var response = await Http.PostAsJsonAsync("/api/auth/login", new { username, password });
- if (!response.IsSuccessStatusCode)
- {
- Snackbar.Add("로그인 실패: 사용자명 또는 비밀번호가 올바르지 않습니다", Severity.Error);
- return;
- }
-
- var json = await response.Content.ReadAsStringAsync();
- var loginResponse = JsonSerializer.Deserialize(json);
- if (loginResponse == null || string.IsNullOrEmpty(loginResponse.AccessToken))
- {
- Snackbar.Add("로그인 실패: 응답 오류", Severity.Error);
- return;
- }
-
- // 로컬 저장소 저장
- await LocalStorageService.SetItemAsStringAsync("accessToken", loginResponse.AccessToken);
- await LocalStorageService.SetItemAsStringAsync("refreshToken", loginResponse.RefreshToken ?? "");
- var expiryTicks = DateTimeOffset.UtcNow.AddSeconds(loginResponse.ExpiresIn).UtcTicks;
- await LocalStorageService.SetItemAsStringAsync("tokenExpiry", expiryTicks.ToString());
-
- // 아이디 저장
- if (rememberMe)
- {
- await LocalStorageService.SetItemAsStringAsync(RememberedUsernameKey, username);
- await LocalStorageService.SetItemAsStringAsync(RememberedCheckboxKey, "true");
- }
- else
- {
- await LocalStorageService.RemoveItemAsync(RememberedUsernameKey);
- await LocalStorageService.RemoveItemAsync(RememberedCheckboxKey);
- }
-
- // Blazor 인증 상태 업데이트 (직접 호출)
- if (AuthStateProvider is CustomAuthenticationStateProvider customProvider)
- {
- await customProvider.LoginAsync(loginResponse.AccessToken, loginResponse.RefreshToken ?? "", loginResponse.ExpiresIn);
- }
-
- // 대시보드로 이동
- Navigation.NavigateTo("/admin/dashboard", replace: true);
- }
- catch (Exception ex)
- {
- Snackbar.Add($"로그인 중 오류: {ex.Message}", Severity.Error);
- }
- finally
- {
- isLoggingIn = false;
- }
- }
-
- private class LoginResponse
- {
- public string AccessToken { get; set; } = "";
- public string RefreshToken { get; set; } = "";
- public int ExpiresIn { get; set; }
- }
-}
diff --git a/src/TaxBaik.Web/wwwroot/js/admin-session.js b/src/TaxBaik.Web/wwwroot/js/admin-session.js
index cc25b94..51190f9 100644
--- a/src/TaxBaik.Web/wwwroot/js/admin-session.js
+++ b/src/TaxBaik.Web/wwwroot/js/admin-session.js
@@ -342,11 +342,11 @@ window.taxbaikAdminSession = {
localStorage.removeItem('admin-remember-checkbox');
}
- // 토큰 저장 후 현재 페이지 새로고침
- // 이렇게 하면 WASM이 부팅되면서 CustomAuthenticationStateProvider가 localStorage에서
- // 토큰을 복원하고, 그 후 자동으로 인증된 사용자를 대시보드로 리다이렉트함
+ // 토큰 저장 후 대시보드로 이동
+ // Blazor가 대시보드 페이지를 로드할 때 CustomAuthenticationStateProvider가
+ // 자동으로 localStorage에서 토큰을 복원합니다
setTimeout(() => {
- window.location.reload();
+ window.location.href = '/taxbaik/admin/dashboard';
}, 200);
} catch (error) {
window.taxbaikAdminSession.traceUiState('admin-login', `submit failed: ${error?.message || 'login failed'}`);