website/Website/Controllers/AccountController.cs
2020-04-12 14:25:16 +01:00

55 lines
No EOL
1.7 KiB
C#

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<IActionResult> 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<IActionResult> 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);
}
}
}