using System.Security.Claims; using LEA.Models; using LEA.ViewModels; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; namespace LEA.Controllers; public class AccountController : Controller { private readonly UserManager _userManager; private readonly SignInManager _signInManager; private readonly ILogger _logger; public AccountController( UserManager userManager, SignInManager signInManager, ILogger logger) { _userManager = userManager; _signInManager = signInManager; _logger = logger; } [HttpGet] [AllowAnonymous] public IActionResult Register() { return View(new RegisterViewModel()); } [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task Register(RegisterViewModel model) { if (!ModelState.IsValid) { return View(model); } var existingUser = await _userManager.FindByEmailAsync(model.Email); if (existingUser != null) { ModelState.AddModelError(nameof(model.Email), "Diese E-Mail-Adresse wird bereits verwendet."); return View(model); } var user = new ApplicationUser { FullName = model.FullName.Trim(), Email = model.Email.Trim(), UserName = model.Email.Trim(), CreatedAt = DateTime.UtcNow }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { await _userManager.AddClaimAsync(user, new Claim("FullName", user.FullName)); await _signInManager.SignInAsync(user, isPersistent: true); _logger.LogInformation("Neuer Benutzer {Email} wurde erstellt und angemeldet.", user.Email); TempData["Success"] = "Registrierung erfolgreich. Willkommen zurück!"; return RedirectToAction("Index", "Applications"); } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, TranslateIdentityError(error)); } return View(model); } [HttpGet] [AllowAnonymous] public IActionResult Login(string? returnUrl = null) { return View(new LoginViewModel { ReturnUrl = returnUrl }); } [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task Login(LoginViewModel model) { if (!ModelState.IsValid) { return View(model); } var user = await _userManager.FindByEmailAsync(model.Email); if (user == null) { ModelState.AddModelError(string.Empty, "Ungültige Anmeldedaten."); return View(model); } var result = await _signInManager.PasswordSignInAsync(user, model.Password, model.RememberMe, lockoutOnFailure: false); if (result.Succeeded) { _logger.LogInformation("Benutzer {Email} hat sich angemeldet.", user.Email); if (!string.IsNullOrWhiteSpace(model.ReturnUrl) && Url.IsLocalUrl(model.ReturnUrl)) { return Redirect(model.ReturnUrl); } TempData["Success"] = "Erfolgreich angemeldet."; return RedirectToAction("Index", "Applications"); } ModelState.AddModelError(string.Empty, "Ungültige Anmeldedaten."); return View(model); } [HttpPost] [Authorize] [ValidateAntiForgeryToken] public async Task Logout() { await _signInManager.SignOutAsync(); TempData["Success"] = "Sie wurden abgemeldet."; return RedirectToAction("Index", "Home"); } private static string TranslateIdentityError(IdentityError error) => error.Code switch { "PasswordTooShort" => "Das Passwort ist zu kurz.", "PasswordRequiresNonAlphanumeric" => "Das Passwort muss mindestens ein Sonderzeichen enthalten.", "PasswordRequiresDigit" => "Das Passwort muss mindestens eine Zahl enthalten.", "PasswordRequiresUpper" => "Das Passwort muss mindestens einen Großbuchstaben enthalten.", "PasswordRequiresLower" => "Das Passwort muss mindestens einen Kleinbuchstaben enthalten.", "DuplicateEmail" or "DuplicateUserName" => "Diese E-Mail-Adresse wird bereits verwendet.", "InvalidEmail" => "Bitte eine gültige E-Mail-Adresse eingeben.", _ => error.Description }; }