From 52f1790acb0b514e12170e28cc27d4306203f338 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sun, 28 Jun 2026 16:43:10 +0900 Subject: [PATCH] feat: add admin username remember functionality to login page - Add 'Remember ID' checkbox for improved UX - Store username in localStorage when checked - Restore saved username on login page load - Remove saved username when checkbox unchecked - Follow security best practice: save username only, not password --- .../Components/Admin/Pages/Login.razor | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/TaxBaik.Web/Components/Admin/Pages/Login.razor b/TaxBaik.Web/Components/Admin/Pages/Login.razor index b9f0e3b..5ea44a0 100644 --- a/TaxBaik.Web/Components/Admin/Pages/Login.razor +++ b/TaxBaik.Web/Components/Admin/Pages/Login.razor @@ -6,6 +6,7 @@ @inject NavigationManager NavigationManager @inject CustomAuthenticationStateProvider AuthStateProvider @inject IJSRuntime Js +@inject ILocalStorageService LocalStorageService 로그인 @@ -27,6 +28,11 @@ autocomplete="current-password" @bind-Value="model.Password" /> +
+ + +
+ @if (!string.IsNullOrEmpty(errorMessage)) { @errorMessage @@ -53,8 +59,25 @@ @code { private bool isLoading = false; private string errorMessage = ""; - private LoginModel model = new(); + private const string RememberedUsernameKey = "admin-remembered-username"; + + protected override async Task OnInitializedAsync() + { + try + { + var remembered = await LocalStorageService.GetItemAsStringAsync(RememberedUsernameKey); + if (!string.IsNullOrEmpty(remembered)) + { + model.Username = remembered; + model.RememberMe = true; + } + } + catch + { + // LocalStorage not available in pre-render + } + } protected override async Task OnAfterRenderAsync(bool firstRender) { @@ -82,6 +105,15 @@ return; } + if (model.RememberMe) + { + await LocalStorageService.SetItemAsStringAsync(RememberedUsernameKey, model.Username); + } + else + { + await LocalStorageService.RemoveItemAsync(RememberedUsernameKey); + } + await ApiClient.SetAuthToken(response.AccessToken); await AuthStateProvider.LoginAsync(response.AccessToken, response.RefreshToken, response.ExpiresIn); NavigationManager.NavigateTo(GetReturnUrl(), forceLoad: false); @@ -104,6 +136,7 @@ { public string Username { get; set; } = ""; public string Password { get; set; } = ""; + public bool RememberMe { get; set; } } private string GetReturnUrl()