본문 바로가기
ASP.NET Core

ASP.NET Core MVC 6] UserManager, SignInManager을 이용한 회원가입, 로그인

by Fastlane 2022. 1. 12.
728x90
반응형

https://github.com/BigExecution/CoreMVC_Login

 

GitHub - BigExecution/CoreMVC_Login

Contribute to BigExecution/CoreMVC_Login development by creating an account on GitHub.

github.com

IdentityUser를 사용하기 위한 준비는 다음 글을 참고해주세요 

https://bigexecution.tistory.com/94

 

ASP.NET Core MVC 6] Identity

ASP.NET Core Identity는 로그인 기능을 지원하는 API이다. 사용자, 암호, 프로필 데이터, 역할, 클레임, 토큰, 메일 확인 등을 관리한다. Facebook, Google, Microsoft, Twitter 같은 외부 로그인도 사용할 수 있..

bigexecution.tistory.com

UserManager<TUser> class는 user 관리에 필요한 함수들이 있다.

CreateAsync, DeleteAsync, UpdateAsync...

 

SignInManager<TUser>class는 로그인에 필요한 함수들이 있다. 

SignInAsync, SignOutAsync, IsSignedIn...

 

  • 둘다, AccountController에 생성자 주입을 통해서 주입된다. 
  • 둘다, generic parameter를 받는다. 
  • built-in IdentityUser class를 generic parameter의 argument로 사용한다. 
  • built-int IdentityUser class는 확장하여 사용이 가능하다. 

1. 회원가입 용 RegisterViewMocel, 로그인 용 LoginViewModel 추가 

using System.ComponentModel.DataAnnotations;

namespace Employee.ViewModels
{
    public class RegisterViewModel
    {
        [Required]
        [EmailAddress]
        public string Email { get; set; }

        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        [Compare("Password", ErrorMessage = "Password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }
    }
}
using System.ComponentModel.DataAnnotations;

namespace Employee.ViewModels
{
    public class LoginViewModel
    {
        [Required]
        [EmailAddress]
        public string Email { get; set; }

        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }

        [Display(Name = "Remember me")]
        public bool RememberMe { get; set; }
    }
}

2. AccountController.cs 추가 

using Employee.ViewModels;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;

namespace Employee.Controllers
{
    public class AccountController : Controller
    {
        private readonly UserManager<IdentityUser> userManager;
        private readonly SignInManager<IdentityUser> signInManager;

        public AccountController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager)
        { 
            this.userManager = userManager;
            this.signInManager = signInManager;
        }

        [HttpGet]
        public IActionResult Register()
        {
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            { 
                var user = new IdentityUser { UserName = model.Email, Email = model.Email };
                var result = await userManager.CreateAsync(user, model.Password);

                if (result.Succeeded)
                { 
                    await signInManager.SignInAsync(user, isPersistent: false);
                    return RedirectToAction("Index", "Home");
                }

                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError("", error.Description);
                }
            }

            return View(model);
        }

        [HttpPost]
        public async Task<IActionResult> Logout()
        {
            await signInManager.SignOutAsync();
            return RedirectToAction("Index", "Home");
        }


        [HttpGet]
        public IActionResult Login()
        {
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> Login(LoginViewModel model)
        {
            if (ModelState.IsValid)
            {
                var result = await signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false);

                if (result.Succeeded)
                {
                    return RedirectToAction("Index", "Home");
                }

                ModelState.AddModelError(String.Empty, "Invalid Login Attempt");
            }

            return View(model);
        }
    }
}

3. Register.cshtml, Login.cshtml 추가 

@model Employee.ViewModels.RegisterViewModel

@{
    ViewBag.Title = "User Registration";
}

<h1>User Registration</h1>

<div class="row">
    <div class="col-md-12">
        <form method="post">
            <div asp-validation-summary="All" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Email"></label>
                <input asp-for="Email" class="form-control" />
                <span asp-validation-for="Email" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Password"></label>
                <input asp-for="Password" class="form-control" />
                <span asp-validation-for="Password" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ConfirmPassword"></label>
                <input asp-for="ConfirmPassword" class="form-control" />
                <span asp-validation-for="ConfirmPassword" class="text-danger"></span>
            </div>
            <button type="submit" class="btn btn-primary">Register</button>
        </form>
    </div>
</div>
@model Employee.ViewModels.LoginViewModel
@{
    ViewBag.Title = "User Login";
}

<h1>User Login</h1>

<div class="row">
    <div class="col-md-12">
        <form method="post">
            <div asp-validation-summary="All" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Email"></label>
                <input asp-for="Email" class="form-control" />
                <span asp-validation-for="Email" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Password"></label>
                <input asp-for="Password" class="form-control" />
                <span asp-validation-for="Password" class="text-danger"></span>
            </div>
            <div class="form-group">
                <div class="checkbox">                    
                    <label asp-for="RememberMe">
                        <input asp-for="RememberMe" />
                            @Html.DisplayNameFor(m => m.RememberMe)
                    </label>
                </div>
            </div>
            <button type="submit" class="btn btn-primary">Login</button>
        </form>
    </div>
</div>

3. _Layout.cshml 수정

                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
                        </li>
                    </ul>
                    @if (SignInManager.IsSignedIn(User))
                    {
                        <form asp-area="" asp-controller="Account" asp-action="Logout" method="post" id="logoutForm">
                            <ul class="nav navbar-nav navbar-right">
                                <li class="nav-item">
                                    Hello @UserManager.GetUserName(User)!
                                </li>
                                <li>
                                    <button type="submit" class="btn btn-link navbar-btn navbar-link">Log out</button>
                                </li>
                            </ul>
                        </form>
                    }
                    else
                    {
                        <ul class="nav navbar-nav navbar-right">
                            <li class="nav-item">
                                <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="Register">Register</a>
                            </li>
                            <li class="nav-item">
                                <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="Login">Log in</a>
                            </li>
                        </ul>
                    }

4. _ViewImports.cshtml 파일에 Microsoft.AspNetCore.Identity 추가 

@using Employee
@using Employee.Models
@using Microsoft.AspNetCore.Identity
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

 

ASPNETUsers 테이블에 데이터가 추가된 것을 확인할 수 있다. 

728x90
반응형

댓글