@page "/admin/login" @using Microsoft.FluentUI.AspNetCore.Components @using System.ComponentModel.DataAnnotations @layout TaxBaik.Web.Components.Admin.Layout.BlankLayout @attribute [AllowAnonymous] @inject IApiClient ApiClient @inject NavigationManager NavigationManager @inject CustomAuthenticationStateProvider AuthStateProvider @inject IJSRuntime Js @inject ILocalStorageService LocalStorageService 로그인
@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) { if (firstRender) await Js.InvokeVoidAsync("taxbaikAdminSession.syncRouteClass"); } private async Task HandleLogin() { if (isLoading) return; isLoading = true; errorMessage = ""; try { var request = new { model.Username, model.Password }; var response = await ApiClient.PostAsync("auth/login", request); if (response?.AccessToken == null || response?.RefreshToken == null) { errorMessage = "사용자명 또는 비밀번호가 올바르지 않습니다."; isLoading = false; 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); } catch { errorMessage = "로그인 중 오류가 발생했습니다."; isLoading = false; } } private class LoginResponse { public string AccessToken { get; set; } = ""; public string RefreshToken { get; set; } = ""; public int ExpiresIn { get; set; } } private class LoginModel { public string Username { get; set; } = ""; public string Password { get; set; } = ""; public bool RememberMe { get; set; } } private string GetReturnUrl() { var uri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri); if (!Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query).TryGetValue("returnUrl", out var returnUrl) || string.IsNullOrWhiteSpace(returnUrl)) { return "/taxbaik/admin/dashboard"; } var value = returnUrl.ToString(); if (!value.StartsWith("admin", StringComparison.OrdinalIgnoreCase)) { return "/taxbaik/admin/dashboard"; } return $"/taxbaik/{value.TrimStart('/')}"; } }