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
This commit is contained in:
2026-06-28 16:43:10 +09:00
parent cd3bc8357c
commit 52f1790acb
+34 -1
View File
@@ -6,6 +6,7 @@
@inject NavigationManager NavigationManager
@inject CustomAuthenticationStateProvider AuthStateProvider
@inject IJSRuntime Js
@inject ILocalStorageService LocalStorageService
<PageTitle>로그인</PageTitle>
@@ -27,6 +28,11 @@
autocomplete="current-password"
@bind-Value="model.Password" />
<div class="mb-4">
<InputCheckbox class="mud-checkbox" @bind-Value="model.RememberMe" />
<label style="margin-left: 8px; cursor: pointer;">아이디 저장</label>
</div>
@if (!string.IsNullOrEmpty(errorMessage))
{
<MudAlert Severity="Severity.Error" Class="mb-4">@errorMessage</MudAlert>
@@ -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()