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
반응형
'ASP.NET Core' 카테고리의 다른 글
ASP.NET Core MVC 6] Authentication VS Authorization (0) | 2022.01.14 |
---|---|
ASP.NET Core MVC 6] Identity 확장 (0) | 2022.01.13 |
ASP.NET Core MVC 6] Identity (0) | 2022.01.12 |
ASP.NET Core MVC] Routing 라우팅 (0) | 2022.01.11 |
ASP.NET Core MVC] ViewData, [ViewData] attribute, ViewBag (0) | 2022.01.10 |
댓글