Phantom Programming 팬텀 프로그래밍
  • [ERP 개발 일지] 로그인 프로세스
    2024년 12월 06일 13시 54분 44초에 업로드 된 글입니다.
    작성자: Devrun
    반응형

    FoodFlow에서 프로젝트 명을 ERP로 변경했다.

            public IActionResult SignIn(Account account) {
                var user = _context.Accounts.FirstOrDefault(a => a.Account_ID == account.Account_ID);
    
                //user validation
                if (user != null)
                {
                    //Define Password Hasher
                    var hasher = new PasswordHasher<object>();
                    //Hashing User Password
                    var hashed = hasher.HashPassword(null, account.Account_Password);
                    //Hashing verifying
                    var verify = hasher.VerifyHashedPassword(null, user.Account_Password, account.Account_Password);
    
                    if (verify == PasswordVerificationResult.Success)
                    {
                        var claims = new List<Claim>
                    {
                        new Claim(ClaimTypes.Name, user.Account_ID),
                        new Claim(ClaimTypes.Role, "User")
                    };
    
                        var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
    
                        var authProperties = new AuthenticationProperties
                        {
                            IsPersistent = true,
                            ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(30)
                        };
    
                        HttpContext.SignInAsync("CookieAuth", new ClaimsPrincipal(identity), authProperties).Wait();
    
                        return RedirectToAction("Index", "Dashboard");
                    }
    
                    ViewBag.ErrorMessage = "아이디 또는 비밀번호가 잘 못되었습니다.";
                    return RedirectToAction("Index", "Home");
    
                } else
                {
                    ViewBag.ErrorMessage = "아이디 또는 비밀번호가 잘 못되었습니다.";
                    return RedirectToAction("Index", "Home");
                }
            }

     

    위 코드는 내가 만들었지만, 구글링을 통해 정보를 수집해서 만들었다.  전체적인 프로세스를 보면

     

    로그인시도 -> 입력 정보를 Account 모델로 전송 -> Db 사용자 검색 -> 사용자가 있으면 비밀번호 암호화 실행 -> db에서 가져온 암호와 비교 -> 최종적으로 암호화 비교 성공과 실패에 따른 결과를 표시

     

    이 과정에서 많은 시행착오를 겪었다. 예를 들어 로그인 정보를 입력하면 비밀번호가 먹통이 되던가 에러가 뜨던가 하면서 계속 시간을 잡아먹었다. ㅠㅠ 그래도 어쨌든 결과적으로는 만들어냈다. 

     

    Sign In Function

            public IActionResult SignIn(Account account) {
    
            }

    이 함수는 Account 모델을 가지고 있다. 어카운트 모델은

    using System.ComponentModel.DataAnnotations;
    
    namespace ERP.Models
    {
        public class Account
        {
            [Key]
            public int Account_Number { get; set; }
    
            [Required]
            public string Account_ID { get; set; }
    
            [Required]
            public string Account_Password { get; set; }
        }
    }

    위와 같다. 즉 사용자가 입력한 비밀번호 아이디가 Account 모델로 들어간다.

    예를들어 아이디가 test이고 비밀번호가 123123이면 Account_ID = test / Account_Password = 123123이 된다.

    var user = _context.Accounts.FirstOrDefault(a => a.Account_ID == account.Account_ID);

     

    Account 모델에서 정보를 받아오면 Db에 접속해서 데이터를 가져와야 하지 않겠나? 그렇다 바로 이게 사용자를 확인하는 첫 명령이다. Account DB에 들어가서 Account_ID를 가져와 사용자가 입력한 Account_ID를 비교해서 해당 데이터를 user에 대입한다.

     

     //user validation
                if (user != null)
                {
                    //Define Password Hasher
                    var hasher = new PasswordHasher<object>();
                    //Hashing User Password
                    var hashed = hasher.HashPassword(null, account.Account_Password);
                    //Hashing verifying
                    var verify = hasher.VerifyHashedPassword(null, user.Account_Password, account.Account_Password);
    
                    if (verify == PasswordVerificationResult.Success)
                    {
                        var claims = new List<Claim>
                    {
                        new Claim(ClaimTypes.Name, user.Account_ID),
                        new Claim(ClaimTypes.Role, "User")
                    };
    
                        var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
    
                        var authProperties = new AuthenticationProperties
                        {
                            IsPersistent = true,
                            ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(30)
                        };
    
                        HttpContext.SignInAsync("CookieAuth", new ClaimsPrincipal(identity), authProperties).Wait();
    
                        return RedirectToAction("Index", "Dashboard");
                    }
    
                    ViewBag.ErrorMessage = "아이디 또는 비밀번호가 잘 못되었습니다.";
                    return RedirectToAction("Index", "Home");
    
                } else
                {
                    ViewBag.ErrorMessage = "아이디 또는 비밀번호가 잘 못되었습니다.";
                    return RedirectToAction("Index", "Home");
                }

     

    그 후에 최종적으로 위 프로세스가 진행된다.

     

    사용가 없는 경우가 아니면 다음 단계로 없다면 로그인 페이지로 설정한 Index page로 넘어가게 설정한 것이다. 사용자가 있다면 PasswordHasher를 통해서 Hashing을 진행하고 db에 저장된 값과 비교해 결과를 표시하고 결과가 success이면 로그인 후에만 보이는 화면으로 이동한다. 

     

    아래는 결과창이다.

    로그인 화면에서 로그인 폼이 보이고, 로그인 후에는 상단 nav가 보이면서 로그아웃 버튼이 추가되어 있다.

     

    고수들에게는 간단하지만 나에겐 복잡하다... Winform만 만지작 거리던 내가... ASP.NET을 그것도 WebForm만 하던 내가... ASP.NET Core를... ㅠㅠ 사수 없이 하려니 어렵다. 점점

    반응형
    댓글