WebApplicationExtensions.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using Infrastructure.Persistence.Identity;
  2. using Microsoft.AspNetCore.Identity;
  3. namespace Admin.Extensions;
  4. public static class WebApplicationExtensions
  5. {
  6. /// <summary>
  7. /// 초기 관리자 계정 및 Admin 역할을 시드합니다.
  8. /// 계정이 이미 존재하면 Admin 역할만 보장합니다.
  9. /// </summary>
  10. public static async Task SeedAdminAccountAsync(this WebApplication app)
  11. {
  12. using var scope = app.Services.CreateScope();
  13. var userManager = scope.ServiceProvider.GetRequiredService<UserManager<ApplicationUser>>();
  14. var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();
  15. const string adminEmail = "jino@dpot.dev";
  16. const string adminPassword = "Admin@1234";
  17. const string adminRoleName = "Admin";
  18. // Admin 역할이 없으면 생성
  19. if (!await roleManager.RoleExistsAsync(adminRoleName))
  20. {
  21. await roleManager.CreateAsync(new IdentityRole(adminRoleName));
  22. }
  23. // 관리자 계정이 없으면 생성
  24. var existingUser = await userManager.FindByEmailAsync(adminEmail);
  25. if (existingUser == null)
  26. {
  27. var adminUser = new ApplicationUser
  28. {
  29. UserName = adminEmail,
  30. Email = adminEmail,
  31. EmailConfirmed = true
  32. };
  33. var result = await userManager.CreateAsync(adminUser, adminPassword);
  34. if (result.Succeeded)
  35. {
  36. await userManager.AddToRoleAsync(adminUser, adminRoleName);
  37. Console.WriteLine($"[Seed] 관리자 계정 생성 완료: {adminEmail}");
  38. }
  39. else
  40. {
  41. Console.WriteLine($"[Seed] 관리자 계정 생성 실패: {string.Join(", ", result.Errors.Select(e => e.Description))}");
  42. }
  43. }
  44. else
  45. {
  46. // 기존 계정이 Admin 역할이 없으면 추가
  47. if (!await userManager.IsInRoleAsync(existingUser, adminRoleName))
  48. {
  49. await userManager.AddToRoleAsync(existingUser, adminRoleName);
  50. Console.WriteLine($"[Seed] 기존 계정에 Admin 역할 부여: {adminEmail}");
  51. }
  52. }
  53. // 이관/직접 INSERT 계정의 SecurityStamp 누락 보정 — 비밀번호 재설정 토큰 생성에 필수
  54. var stampless = userManager.Users.Where(c => c.SecurityStamp == null).ToList();
  55. foreach (var user in stampless)
  56. {
  57. await userManager.UpdateSecurityStampAsync(user);
  58. Console.WriteLine($"[Seed] SecurityStamp 보정: {user.Email}");
  59. }
  60. }
  61. }