본문 바로가기

카테고리 없음

ASP.NET Core MVC 게시판 만들기_4 / 로그인 기능

728x90
728x90

1. 로그인 입력 뷰 페이지 작성

Login.cshtml
- 회원가입이 정상적으로 완료된 회원이 로그인 시도 시 입력할 뷰 페이지 작성

@model LoginViewModel
@{
    ViewData["Title"] = "로그인";
}

<form class="" method="post" asp-controller="Account" asp-action="Login">
    <div class="col-lg-10">
        <div class="text-danger" asp-validation-summary="ModelOnly"></div>

        <div class="form-group">
            <label>사용자 ID</label>
            <input type="text" class="form-control" placeholder="사용자 ID 입력" asp-for="UserId" />
            <span class="text-danger" asp-validation-for="UserId"></span>
        </div>

        <div class="form-group">
            <label>비밀번호</label>
            <input type="password" class="form-control" placeholder="비밀번호 입력" asp-for="UserPassword" />
            <span class="text-danger" asp-validation-for="UserPassword"></span>
        </div>

        <div class="form-group">
            <button type="submit" class="btn btn-success">로그인</button>
        </div>
    </div>
</form>

 

2. 액션 메서드 작성

AccountController.cs > Login(LoginViewModel model)

뷰 페이지의 폴더명과 컨트롤러 명이 동일해야 합니다. 또한 폴더 안의 파일명이 액션 메서드가 동일해야 합니다!

로그인 성공 시
-
뷰 페이지를 통해 입력 받은 사용자 정보의 유효성을 확인 > Data Annotations 사용
- 입력 데이터와 DB에 동일한 데이터가 있는지 검색 > LINQ 사용

로그인 불가능 시
- 다시 뷰 페이지로 돌아가도록 합니다.

using AspNetNote.DataContext;
using AspNetNote.Models;
using AspNetNote.ViewModel;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Linq;

namespace AspNetNote.Controllers
{
    public class AccountController : Controller
    {
        // GET: /<controller>/
        public IActionResult Register()
        {
            return View();
        }

        public IActionResult Login()
        {
            return View();
        }

        /// <summary>
        /// 회원가입 전송
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult Register(User model)
        {
            if (ModelState.IsValid)
            {
                using (var db = new AspnetNoteDbContext())
                {
                    db.Users.Add(model);
                    db.SaveChanges();
                }
                return RedirectToAction("Index", "Home");
            }
            return View();
        }

        /// <summary>
        /// 로그인
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult Login(LoginViewModel model)
        {
            if (ModelState.IsValid)
            {
                using (var db = new AspnetNoteDbContext())
                {
                    // LINQ 연산자와 람다 식을 사용
                    // var user = db.Users.FirstOrDefault(u=> u.UserId == model.UserId && u.UserPassword == model.UserPassword);

                    // ↓새로운 string 객체의 생성을 방지해 메모리 유수 없이 사용 가능한 장점이 있음
                    var user = db.Users.FirstOrDefault(u => u.UserId.Equals(model.UserId) &&
                                                            u.UserPassword.Equals(model.UserPassword));
                    if (user != null)
                    {
                        //HttpContext.Session.SetInt32(key, value);  식별자, 실제 데이터
                        HttpContext.Session.SetInt32("USER_LOGIN_KEY", user.UserNo);
                        // 로그인 성공 > 로그인 성공 페이지로 이동
                        return RedirectToAction("LoginSuccess", "Home");
                    }
                }
                // 로그인 실패  사용자 ID 자체가 회원가입이 안되있는 경우
                ModelState.AddModelError(string.Empty, "사용자 ID 혹은 비밀번호가 올바르지 않습니다.");
            }
            return View(model);
        }

        public IActionResult Logout()
        {
            HttpContext.Session.Remove("USER_LOGIN_KEY");
            return RedirectToAction("Index", "Home");
        }
    }
}

🌟 DI - Sission 🌟

NuGet 패키지 미들웨어 Session 설치
-웹 서버가 로그인한 사용자의 정보를 메모리에 담아둘 수 있도록 Session을 이용할 수 있도록 미들웨어를 설치

의존성 주입 ( DI ) > Startup.cs
- ConfigureServices(IServiceCollection services) > service.AddSession(); 추가 작성  
- Configure(IApplicationBuilder app, IHostingEnvironment env) > app.UseSession(); 추가 작성

Session KeyUserNo 생성
-DB에서 가져온 데이터 중 사용자 번호인 UserNo를 사용하여 USER_LOGIN_KEYSession Key  등록

_Layout.cshtml
Session Key의 유/무를 통해 로그인한 상태라면 회원가입과 로그인 버튼이 보이지 않게 수정


3. 로그인 뷰 모델 클래스 작성

LoginViewModel.cs

- 로그인 시도 시 뷰 페이지를 통해 입력 받은 사용자 정보의 유효성을 확인할 수 있는 모델 작성
using System.ComponentModel.DataAnnotations;

namespace AspNetNote.ViewModel
{
    public class LoginViewModel
    {
        [Required(ErrorMessage = "사용자 ID를 입력하세요.")]
        public string UserId { get; set; }

        [Required(ErrorMessage = "사용자 비밀번호를 입력하세요.")]
        public string UserPassword { get; set; }
    }
}

 

 

4. 로그인 성공 액션 메서드 작성 및 뷰 페이지 작성

HomeController.cs > LoginSuccess( )

 

LoginSuccess.cshtml

뷰 페이지의 폴더명과 컨트롤러 명이 동일해야 합니다. 또한 폴더 안의 파일명이 액션 메서드가 동일해야 합니다!

@model User
@{
    ViewData["Title"] = "로그인 성공";
}

<div class="alert alert-primary" role="alert">
    로그인에 성공했습니다.
</div>

 

728x90
728x90