using System.Linq; using System.Threading.Tasks; using HN.Infrastructure.Identity; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Website.Models; namespace Website.Controllers { public sealed class AccountsController : BaseController { private readonly UserManager _userManager; private readonly SignInManager _signInManager; public AccountsController(UserManager userManager, SignInManager signInManager) { _userManager = userManager; _signInManager = signInManager; } [AllowAnonymous] public IActionResult Register() { return View(); } [HttpPost] [ValidateAntiForgeryToken] [AllowAnonymous] public async Task Register(RegisterViewModel command) { if (!ModelState.IsValid) { return View(command); } var user = new User(command.Username); var result = await _userManager.CreateAsync(user, command.Password); if (!result.Succeeded) { ModelState.AddModelError(nameof(RegisterViewModel.Username), string.Join(", ", result.Errors.Select(e => e.Description))); return View(command); } SetFlash("Account created, you can now sign in!"); return RedirectToAction(nameof(Login)); } [AllowAnonymous] public IActionResult Login() { return View(); } [HttpPost] [ValidateAntiForgeryToken] [AllowAnonymous] public async Task Login(LoginViewModel command) { if (!ModelState.IsValid) { return View(); } var user = await _userManager.FindByNameAsync(command.Username); if (user == null) { ModelState.AddModelError(nameof(LoginViewModel.Username), "Could not verify user identity"); return View(); } var result = await _signInManager.PasswordSignInAsync(user, command.Password, true, false); if (!result.Succeeded) { ModelState.AddModelError(nameof(LoginViewModel.Username), "Could not verify user identity"); return View(); } SetFlash("Successfuly connected!"); return RedirectToAction(nameof(LinksController.Index), "Links"); } [HttpPost] [ValidateAntiForgeryToken] public async Task Logout() { await _signInManager.SignOutAsync(); SetFlash("Successfuly disconnected!"); return RedirectToAction(nameof(Login)); } } }