Refactor admin login to cookie auth
TaxBaik CI/CD / build-and-deploy (push) Failing after 2m23s

This commit is contained in:
2026-07-09 11:07:09 +09:00
parent 88c1d835b5
commit 0545964468
7 changed files with 177 additions and 54 deletions
-30
View File
@@ -64,33 +64,3 @@
</div>
</section>
@if (Model.LoginSucceeded && Model.TokenPair is not null)
{
<script>
(function () {
const tokenPair = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(
Model.TokenPair,
new System.Text.Json.JsonSerializerOptions { PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase }));
const expiryTicks = 621355968000000000 + ((Date.now() + (tokenPair.expiresIn || 3600) * 1000) * 10000);
localStorage.setItem('accessToken', tokenPair.accessToken || '');
localStorage.setItem('refreshToken', tokenPair.refreshToken || '');
localStorage.setItem('tokenExpiry', String(expiryTicks));
@if (Model.RememberMe)
{
<text>
localStorage.setItem('admin-remembered-username', @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Model.Username)));
localStorage.setItem('admin-remember-checkbox', 'true');
</text>
}
else
{
<text>
localStorage.removeItem('admin-remembered-username');
localStorage.removeItem('admin-remember-checkbox');
</text>
}
window.location.replace(@Html.Raw(System.Text.Json.JsonSerializer.Serialize(Model.RedirectUrl)));
})();
</script>
}
+20 -20
View File
@@ -1,7 +1,8 @@
using System.ComponentModel.DataAnnotations;
using System.Security.Claims;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using TaxBaik.Web.Endpoints.Auth;
using Microsoft.AspNetCore.Authentication;
using TaxBaik.Web.Services;
namespace TaxBaik.Web.Pages.Admin;
@@ -27,11 +28,6 @@ public class LoginModel(AuthService authService) : PageModel
public string? ReturnUrl { get; set; }
public string? ErrorMessage { get; set; }
public bool LoginSucceeded { get; set; }
public TokenPairResponse? TokenPair { get; set; }
public string RedirectUrl { get; set; } = "/admin/dashboard";
public void OnGet()
@@ -49,28 +45,32 @@ public class LoginModel(AuthService authService) : PageModel
return Page();
}
var authResult = await authService.AuthenticateAndGenerateTokenPairAsync(Username, Password);
if (!authResult.IsSuccess || authResult.TokenPair is null)
var user = await authService.AuthenticateAsync(Username, Password);
if (user is null)
{
ErrorMessage = authResult.FailureReason switch
{
AuthFailureReason.DatabaseUnavailable => "로그인 서비스를 일시적으로 사용할 수 없습니다. 잠시 후 다시 시도하세요.",
_ => "아이디 또는 비밀번호가 올바르지 않습니다."
};
ErrorMessage = "아이디 또는 비밀번호가 올바르지 않습니다.";
return Page();
}
LoginSucceeded = true;
RedirectUrl = NormalizeRedirectUrl(ReturnUrl);
TokenPair = new TokenPairResponse
var claims = new List<Claim>
{
AccessToken = authResult.TokenPair.AccessToken,
RefreshToken = authResult.TokenPair.RefreshToken,
ExpiresIn = authResult.TokenPair.ExpiresIn,
Token = authResult.TokenPair.AccessToken
new(ClaimTypes.NameIdentifier, user.Id.ToString()),
new(ClaimTypes.Name, user.Username),
new(ClaimTypes.Role, "Admin")
};
return Page();
var identity = new ClaimsIdentity(claims, AdminAuthDefaults.Scheme);
var principal = new ClaimsPrincipal(identity);
var properties = new AuthenticationProperties
{
IsPersistent = RememberMe,
RedirectUri = RedirectUrl
};
await HttpContext.SignInAsync(AdminAuthDefaults.Scheme, principal, properties);
return LocalRedirect(RedirectUrl);
}
private static string NormalizeRedirectUrl(string? returnUrl)