using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Website.Data; using Website.Models; using Website.ViewModels; namespace Website.Controllers { public class AccountController:Controller { private readonly IAuthenticationProvider _authenticationProvider; public AccountController(IAuthenticationProvider authenticationProvider) => _authenticationProvider = authenticationProvider; [Authorize] public IActionResult Index() => View(); [HttpGet] public IActionResult Login(string returnUrl, bool failedAttempt = false) { var model = new LoginViewModel { ReturnUrl = returnUrl, FailedAttempt = failedAttempt }; return View(model); } [HttpPost] public async Task Login(LoginRequest request) { try { var user = await _authenticationProvider.Authenticate(request); return user != null ? await SetIdentityAndRedirect(request.ReturnUrl, user) : Login(request.ReturnUrl, true); } catch { return Login(request.ReturnUrl, true); } } private async Task SetIdentityAndRedirect(string returnUrl, User user) { var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme); identity.AddClaim(new Claim(ClaimTypes.Name, user.Username)); identity.AddClaim(new Claim(ClaimTypes.Email, user.Username)); var principal = new ClaimsPrincipal(identity); await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal); return string.IsNullOrEmpty(returnUrl) ? (IActionResult) RedirectToAction(nameof(Index)) : Redirect(returnUrl); } } }