using Microsoft.AspNetCore.Mvc; using Berufsschule_HAM.Models; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using System.Security.Claims; using Berufsschule_HAM.Services; using ElmahCore; using Berufsschule_HAM.Exceptions; using Microsoft.AspNetCore.Authorization; [ApiExplorerSettings(IgnoreApi = true)] [Route("[controller]")] public class HomeController : Controller { private readonly LdapService _ldap; public HomeController(LdapService ldap) { _ldap = ldap ?? throw new ArgumentNullException(nameof(ldap)); } [Authorize] [HttpGet("Index")] [HttpGet("/")] public ActionResult Index() { return View(); } [Authorize] [HttpGet("Assets")] public async Task Assets() { IEnumerable users = await _ldap.ListUsersAsync(); IEnumerable assets = await _ldap.ListDeviceAsync(); IEnumerable locations = await _ldap.ListLocationsAsync(); List assetsTableViewModels = []; foreach (AssetModel asset in assets) { assetsTableViewModels.Add(new() { AssetCn = asset.Cn, AssetName = asset.Name, LocationName = asset.Location, UserUID = asset.Owner?.Split('=')[1], }); } return View(new HomeIndexViewModel() { AssetsTableViewModels = assetsTableViewModels }); } [Authorize] [HttpGet("Inventory")] public ActionResult Inventory() { return View(); } [Authorize] [HttpGet("Locations")] public async Task LocationsAsync() { IEnumerable locations = await _ldap.ListLocationsAsync(); List LocationsTableViewModels = []; foreach (LocationModel location in locations) { LocationsTableViewModels.Add(new() { LocationID = location.Location, LocationName = location.Description?.Location ?? "", RoomNumber = location.Description?.RoomNumber ?? "", Seat = location.Description?.Seat ?? "" }); } return View(new LocationsIndexViewModel() { LocationTableViewModels = LocationsTableViewModels }); } [Authorize] [HttpGet("Users")] public async Task UsersAsync() { IEnumerable users = await _ldap.ListUsersAsync(); List UserTableViewModels = []; foreach (UserModel user in users) { UserTableViewModels.Add(new() { JpegPhoto = user.JpegPhoto ?? "", Name = user.Cn ?? "", Surname = user.Sn ?? "", Title = user.Title ?? "", Uid = user.Uid, Workplace = user.Description?.Workplace ?? "" }); } return View(new UsersIndexViewModel() { UserTableViewModels = UserTableViewModels }); } [Authorize] [HttpGet("Groups")] public async Task GroupsAsync() { IEnumerable groups = await _ldap.ListGroupsAsync(); return View(new GroupsIndexViewModel(groups)); } [HttpPost("Login")] public async Task Login(string username, string password) { var authenticationResult = await _ldap.AuthenticateUser(username, password); if (authenticationResult.Success) { List claims = [ new(ClaimTypes.Name, username) ]; var claimsIdentity = new ClaimsIdentity( claims, CookieAuthenticationDefaults.AuthenticationScheme); var authProperties = new AuthenticationProperties { IsPersistent = true, ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(300) }; await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties); return RedirectToAction("Index", "Home"); } switch (authenticationResult.AuthenticationState) { case UserNotAuthenticatedReason.InvalidCredentials: return View(new LoginViewModel() { ErrorText = "Invalid login credentials" }); case UserNotAuthenticatedReason.UserLockedOut: return View(new LoginViewModel() { ErrorText = "Your account has been locked. Wait a few minutes or ask an administrator to unlock you" }); case UserNotAuthenticatedReason.UserNotAuthorized: return View(new LoginViewModel() { ErrorText = "You are not authorized for login. Ask an administrator to authorize you." }); default: await HttpContext.RaiseError(new HellFrozeOverException()); return View(new LoginViewModel() { ErrorText = "Hell froze over. Make a screenshot and send it to an administrator." }); } } [HttpGet("Login")] public ActionResult Login() { return View(new LoginViewModel()); } [HttpGet("Logout")] public ActionResult Logout() { HttpContext.SignOutAsync(); return RedirectToAction("Index", "Home"); } [HttpGet("AccessDenied")] public ActionResult AccessDenied() { return View(); } }