using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using NETCore.MailKit.Core;
using System.Threading.Tasks;
namespace TestProject.Controllers
{
/// <summary>
/// 홈 컨트롤러
/// </summary>
public class HomeController : Controller
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 사용자 관리자
/// </summary>
private readonly UserManager<IdentityUser> userManager;
/// <summary>
/// 서명 관리자
/// </summary>
private readonly SignInManager<IdentityUser> signInManager;
/// <summary>
/// E 메일 서비스
/// </summary>
private readonly IEmailService emailService;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - HomeController(userManager, signInManager, emailService)
/// <summary>
/// 생성자
/// </summary>
/// <param name="userManager">사용자 관리자</param>
/// <param name="signInManager">서명 관리자</param>
/// <param name="emailService">E 메일 서비스</param>
public HomeController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager, IEmailService emailService)
{
this.userManager = userManager;
this.signInManager = signInManager;
this.emailService = emailService;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 인덱스 페이지 처리하기 - Index()
/// <summary>
/// 인덱스 페이지 처리하기
/// </summary>
/// <returns>액션 결과</returns>
public IActionResult Index()
{
return View();
}
#endregion
#region 비밀 페이지 처리하기 - Secret()
/// <summary>
/// 비밀 페이지 처리하기
/// </summary>
/// <returns>액션 결과</returns>
[Authorize]
public IActionResult Secret()
{
return View();
}
#endregion
#region 로그인 페이지 처리하기 - Login()
/// <summary>
/// 로그인 페이지 처리하기
/// </summary>
/// <returns>액션 결과</returns>
public IActionResult Login()
{
return View();
}
#endregion
#region 로그인 페이지 처리하기 - Login(userName, password)
/// <summary>
/// 로그인 페이지 처리하기
/// </summary>
/// <param name="userName">사용자명</param>
/// <param name="password">패스워드</param>
/// <returns>액션 결과 태스크</returns>
[HttpPost]
public async Task<IActionResult> Login(string userName, string password)
{
IdentityUser identityUser = await this.userManager.FindByNameAsync(userName);
if(identityUser != null)
{
Microsoft.AspNetCore.Identity.SignInResult signInResult = await this.signInManager.PasswordSignInAsync
(
identityUser,
password,
false,
false
);
if(signInResult.Succeeded)
{
return RedirectToAction("Index");
}
}
return RedirectToAction("Index");
}
#endregion
#region 등록 페이지 처리하기 - Register()
/// <summary>
/// 등록 페이지 처리하기
/// </summary>
/// <returns>액션 결과</returns>
public IActionResult Register()
{
return View();
}
#endregion
#region 등록 페이지 처리하기 - Register(userName, password, mailAddress)
/// <summary>
/// 등록 페이지 처리하기
/// </summary>
/// <param name="userName">사용자명</param>
/// <param name="password">패스워드</param>
/// <param name="mailAddress">메일 주소</param>
/// <returns>액션 결과 태스크</returns>
[HttpPost]
public async Task<IActionResult> Register(string userName, string password, string mailAddress)
{
IdentityUser identityUser = new IdentityUser
{
UserName = userName,
Email = mailAddress
};
IdentityResult result = await this.userManager.CreateAsync(identityUser, password);
if(result.Succeeded)
{
string code = await this.userManager.GenerateEmailConfirmationTokenAsync(identityUser);
var link = Url.Action
(
"ConfirmMailAddress",
"Home",
new { userID = identityUser.Id, code },
Request.Scheme,
Request.Host.ToString()
);
await this.emailService.SendAsync
(
mailAddress,
"메일 주소 확인 요청",
$"<a href=\"{link}\">메일 주소 확인</a>",
true
);
return RedirectToAction("SendMailNotification");
}
return RedirectToAction("Index");
}
#endregion
#region 메일 발송 통지 페이지 처리하기 - SendMailNotification()
/// <summary>
/// 메일 발송 통지 페이지 처리하기
/// </summary>
/// <returns>액션 결과</returns>
public IActionResult SendMailNotification()
{
return View();
}
#endregion
#region 메일 주소 확인 페이지 처리하기 - ConfirmMailAddress(userID, code)
/// <summary>
/// 메일 주소 확인 페이지 처리하기
/// </summary>
/// <param name="userID">사용자 ID</param>
/// <param name="code">코드</param>
/// <returns>액션 결과 태스크</returns>
public async Task<IActionResult> ConfirmMailAddress(string userID, string code)
{
IdentityUser identityUser = await this.userManager.FindByIdAsync(userID);
if(identityUser == null)
{
return BadRequest();
}
IdentityResult identityResult = await this.userManager.ConfirmEmailAsync(identityUser, code);
if(identityResult.Succeeded)
{
return View();
}
return BadRequest();
}
#endregion
#region 로그아웃 페이지 처리하기 - LogOut()
/// <summary>
/// 로그아웃 페이지 처리하기
/// </summary>
/// <returns>액션 결과 태스크</returns>
public async Task<IActionResult> LogOut()
{
await this.signInManager.SignOutAsync();
return RedirectToAction("Index");
}
#endregion
}
}