diff --git a/Areas/Identity/Pages/Account/AccessDenied.cshtml b/Areas/Identity/Pages/Account/AccessDenied.cshtml index 017f6ff..b6219a4 100644 --- a/Areas/Identity/Pages/Account/AccessDenied.cshtml +++ b/Areas/Identity/Pages/Account/AccessDenied.cshtml @@ -2,9 +2,82 @@ @model AccessDeniedModel @{ ViewData["Title"] = "Access denied"; + @inject UserManager _userManager + var user = await _userManager.GetUserAsync(User); + if (user != null) + { + var userComDept = user.departmentId; + var userRole = await _userManager.GetRolesAsync(user); + } } -
-

@ViewData["Title"]

-

You do not have access to this resource.

+
+ +
+@section Scripts { + +} diff --git a/Areas/Identity/Pages/Account/Login.cshtml b/Areas/Identity/Pages/Account/Login.cshtml index 4bea835..0e2e5b2 100644 --- a/Areas/Identity/Pages/Account/Login.cshtml +++ b/Areas/Identity/Pages/Account/Login.cshtml @@ -5,10 +5,19 @@ ViewData["Title"] = "Log in"; } -

@ViewData["Title"]

-
-
-
+
+
+

+
+ + + + + +
+
+
+

Use a local account to log in.


@@ -23,78 +32,61 @@
-
- -
+ +
+
+
+

Use a AD account to log in.

+
+ +
+ + + +
+
+ + + +
-
-
-
-
-

Use a local account to log in.

-
- -
- - - -
-
- - - -
-
- -
-
-
-
-
-

Use another service to log in.

-
- @{ - if ((Model.ExternalLogins?.Count ?? 0) == 0) - { -
-

- There are no external authentication services configured. See this article - about setting up this ASP.NET application to support logging in via external services. -

-
- } - else - { -
+
+
+
+

Use another service to log in.

+
+ @{ + if ((Model.ExternalLogins?.Count ?? 0) == 0) + {

- @foreach (var provider in Model.ExternalLogins!) - { - - } + There are no external authentication services configured. See this article + about setting up this ASP.NET application to support logging in via external services.

- + } + else + { +
+
+

+ @foreach (var provider in Model.ExternalLogins!) + { + + } +

+
+
+ } } - } -
+ +
@@ -104,12 +96,13 @@ diff --git a/Controllers/API/AdminAPI.cs b/Controllers/API/AdminAPI.cs index a3668c0..a328047 100644 --- a/Controllers/API/AdminAPI.cs +++ b/Controllers/API/AdminAPI.cs @@ -20,8 +20,6 @@ namespace PSTW_CentralSystem.Controllers.API private readonly IdentityDBContext _authDbContext; private readonly UserManager _userManager; private readonly SignInManager _signInManager; - // Communication Key for API. Not API authentication key - private readonly string _commKey = "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF4NW42anlkNlpTYzZNSE1Zem9qaApUbldpYTIra2pud2ZNbVhpSWlyK0RadjM2cEVGMGhRUWFLaWpaMWtyMGNiT25Ha2d2QnNwTzNiYkFua0E3SWwzCk4zM3NNYWdQV0JOQzZyVm1jT04zNEhDSWJCM0hvQXFYQUtkSHFUOGZneklMRzFhRzdxK2h4RDZhZzZsemhTMnEKdDA1bHdNc0hONWpOdmVNNnFWalRnTVB4aEFOMUhnUTkrd1lRWFh5bnZYYUo5OUNySHBqS21WdUt2VUh6WXdlRwp6SnBtYXZOclc4bE9oM1lMeVNuUVU5bjRrdURubGc1OWNHeUtKbzJ2YUxZbll4MkR1ZDNabzBXMHRMWGd0dlQyCjVXdVFsY0NVbldvaVpBV1JBTGI3anRpcTF0MGY5eVBiV2gxYXpMMjFoL3QvckJUMXNCL2FQd2kzRCt3MnBUR00KeVFJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg=="; public AdminAPI(ILogger logger, IdentityDBContext authDbContext, UserManager userManager, SignInManager signInManager) { @@ -97,13 +95,13 @@ namespace PSTW_CentralSystem.Controllers.API var userRole = await _userManager.GetRolesAsync(user??new UserModel()); List userInfo = new List(); - if (userRole == null || userRole.Count == 0) - { // Fetch all users excluding those with roles SuperAdmin or SystemAdmin var allUsers = await _authDbContext.Users - .Include(u => u.Department).ThenInclude(d => d!.Company) + .Include(u => u.Department) .ToListAsync(); + if (userRole == null || userRole.Count == 0) + { foreach (var u in allUsers) { var roles = await _userManager.GetRolesAsync(u); @@ -115,126 +113,22 @@ namespace PSTW_CentralSystem.Controllers.API } else { - userInfo = await _authDbContext.Users.Include(u => u.Department).ThenInclude(d => d!.Company).ToListAsync(); + userInfo = await _authDbContext.Users.Include(u => u.Department).ToListAsync(); } - - return Ok(new { UserInfo = userInfo }); + var userList = userInfo.Select(u => new + { + id = u.Id, + email = u.NormalizedEmail, + company = u.Department?.Company?.CompanyName, + department = u.Department, + role = _userManager.GetRolesAsync(u).Result + }).ToList(); + return Ok(new { UserInfo = userList }); } catch (Exception ex) { return StatusCode(500, $"An error occurred: {ex.Message}"); } } - public class LdapLoginCredential - { - public required string username { get; set; } - public required string password { get; set; } - } - - [HttpPost("LdapLogin")] - public async Task LdapLogin([FromBody] LdapLoginCredential ldapLoginInfo) - { - if (!ModelState.IsValid) - { - return BadRequest(ModelState); - } - - byte[] noFormatString = Convert.FromBase64String(_commKey); - string initUrlKey = Encoding.UTF8.GetString(noFormatString); - - string jsonData = JsonSerializer.Serialize(ldapLoginInfo); - - RSA rsaBase = RSA.Create(); - rsaBase.ImportFromPem(initUrlKey.ToCharArray()); - byte[] rsaData = rsaBase.Encrypt(Encoding.UTF8.GetBytes(jsonData), RSAEncryptionPadding.Pkcs1); - string rsaDataBase64 = Convert.ToBase64String(rsaData); - - string ldapUrl = "http://192.168.11.231/api/ldap/"; - string ldapUrlResult = ""; - - using (HttpClient httpClient = new HttpClient()) - { - try - { - StringContent rsaDataB64HttpContent = new(rsaDataBase64, Encoding.UTF8); - HttpResponseMessage ldapUrlResponse = await httpClient.PostAsync(ldapUrl, rsaDataB64HttpContent); - ldapUrlResponse.EnsureSuccessStatusCode(); - if (ldapUrlResponse.IsSuccessStatusCode) - { - ldapUrlResult = await ldapUrlResponse.Content.ReadAsStringAsync(); - } - } - catch (Exception e) - { - return BadRequest(new { Message = $"Message: {e.Message}\nException Caught!" }); - } - } - - userLdapInfo userLdapInfo = JsonSerializer.Deserialize(ldapUrlResult)!; - userInfo userInfo = userLdapInfo.UserInfo; - - if (!userLdapInfo.Authenticated) - { - return BadRequest(new { Message = "Login Failed" }); - } - - UserModel ldapuser = new UserModel() - { - FullName = userInfo.Username, - UserName = userInfo.Email, - NormalizedUserName = userInfo.Email.ToUpper(), - Email = userInfo.Email, - NormalizedEmail = userInfo.Email.ToUpper(), - EmailConfirmed = true, - PhoneNumberConfirmed = false, - TwoFactorEnabled = false, - LockoutEnabled = false, - AccessFailedCount = 0, - }; - var existUser = await doUserExists(ldapuser.Email); - if (existUser == null) - { - await _userManager.CreateAsync(ldapuser); - //await _userManager.SetLockoutEnabledAsync(ldapuser, false); - //return RedirectToAction("AssignRoleAfterLdap", "IdentityController"); - return Ok(new { RedirectUrl = Url.Action("RoleAssignment", "Identity") }); - - }; - - await _signInManager.SignInAsync(existUser, false); - //return RedirectToAction("Index", "HomeController"); - return Ok(new { RedirectUrl = Url.Action("Index", "Home") }); - - } - - public async Task doUserExists(string username) - { - var user = await _userManager.FindByNameAsync(username); - return user != null ? user : null; - } - - class userLdapInfo() - { - public required bool Authenticated { get; set; } - public required userInfo UserInfo { get; set; } - } - class userInfo() - { - public required string FirstName { get; set; } - public required string LastName { get; set; } - public required string DisplayName { get; set; } - public required string Description { get; set; } - public required string Username { get; set; } - public required string Office { get; set; } - public required string Email { get; set; } - public required string Street { get; set; } - public required string City { get; set; } - public required string State { get; set; } - public required string ZipCode { get; set; } - public required string Country { get; set; } - public required string Home { get; set; } - public required string Mobile { get; set; } - - } } } diff --git a/Controllers/API/IdentityAPI.cs b/Controllers/API/IdentityAPI.cs index f57f152..b43846d 100644 --- a/Controllers/API/IdentityAPI.cs +++ b/Controllers/API/IdentityAPI.cs @@ -3,6 +3,9 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using PSTW_CentralSystem.DBContext; using PSTW_CentralSystem.Models; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; namespace PSTW_CentralSystem.Controllers.API { [ApiController] @@ -13,15 +16,20 @@ namespace PSTW_CentralSystem.Controllers.API private readonly ILogger _logger; private readonly IdentityDBContext _authDbContext; private readonly UserManager _userManager; + private readonly SignInManager _signInManager; + // Communication Key for API. Not API authentication key + private readonly string _commKey = "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF4NW42anlkNlpTYzZNSE1Zem9qaApUbldpYTIra2pud2ZNbVhpSWlyK0RadjM2cEVGMGhRUWFLaWpaMWtyMGNiT25Ha2d2QnNwTzNiYkFua0E3SWwzCk4zM3NNYWdQV0JOQzZyVm1jT04zNEhDSWJCM0hvQXFYQUtkSHFUOGZneklMRzFhRzdxK2h4RDZhZzZsemhTMnEKdDA1bHdNc0hONWpOdmVNNnFWalRnTVB4aEFOMUhnUTkrd1lRWFh5bnZYYUo5OUNySHBqS21WdUt2VUh6WXdlRwp6SnBtYXZOclc4bE9oM1lMeVNuUVU5bjRrdURubGc1OWNHeUtKbzJ2YUxZbll4MkR1ZDNabzBXMHRMWGd0dlQyCjVXdVFsY0NVbldvaVpBV1JBTGI3anRpcTF0MGY5eVBiV2gxYXpMMjFoL3QvckJUMXNCL2FQd2kzRCt3MnBUR00KeVFJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg=="; - public IdentityAPI(ILogger logger, IdentityDBContext authDbContext, UserManager userManager) + + public IdentityAPI(ILogger logger, IdentityDBContext authDbContext, UserManager userManager, SignInManager signInManager) { _logger = logger; _authDbContext = authDbContext; _userManager = userManager; + _signInManager = signInManager; } - [HttpPost("GetUserInformation/")] + [HttpPost("GetUserInformation")] public async Task GetUserInformation() { try @@ -30,7 +38,7 @@ namespace PSTW_CentralSystem.Controllers.API var userRole = await _userManager.GetRolesAsync(user!); if (user == null) { - return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + return NotFound(new { message = $"Unable to load user with ID '{_userManager.GetUserId(User)}'."}); } var userInfo = await _authDbContext.Users.Include(u => u.Department).Select(u => new @@ -44,7 +52,7 @@ namespace PSTW_CentralSystem.Controllers.API if (userInfo == null) { - return NotFound("User not found"); + return NotFound(new { message = "User not found" }); } return Ok(new { UserInfo = userInfo }); @@ -54,5 +62,118 @@ namespace PSTW_CentralSystem.Controllers.API return StatusCode(500, $"An error occurred: {ex.Message}"); } } + public class LdapLoginCredential + { + public required string username { get; set; } + public required string password { get; set; } + } + + [HttpPost("LdapLogin")] + public async Task LdapLogin([FromBody] LdapLoginCredential ldapLoginInfo) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + byte[] noFormatString = Convert.FromBase64String(_commKey); + string initUrlKey = Encoding.UTF8.GetString(noFormatString); + + string jsonData = JsonSerializer.Serialize(ldapLoginInfo); + + RSA rsaBase = RSA.Create(); + rsaBase.ImportFromPem(initUrlKey.ToCharArray()); + byte[] rsaData = rsaBase.Encrypt(Encoding.UTF8.GetBytes(jsonData), RSAEncryptionPadding.Pkcs1); + string rsaDataBase64 = Convert.ToBase64String(rsaData); + + string ldapUrl = "http://192.168.11.231/api/ldap/"; + string ldapUrlResult = ""; + + using (HttpClient httpClient = new HttpClient()) + { + try + { + StringContent rsaDataB64HttpContent = new(rsaDataBase64, Encoding.UTF8); + HttpResponseMessage ldapUrlResponse = await httpClient.PostAsync(ldapUrl, rsaDataB64HttpContent); + ldapUrlResponse.EnsureSuccessStatusCode(); + if (ldapUrlResponse.IsSuccessStatusCode) + { + ldapUrlResult = await ldapUrlResponse.Content.ReadAsStringAsync(); + } + } + catch (Exception e) + { + return BadRequest(new { Message = $"Message: {e.Message}\nException Caught!" }); + } + } + + userLdapInfo userLdapInfo = JsonSerializer.Deserialize(ldapUrlResult)!; + + if (!userLdapInfo.Authenticated) + { + return BadRequest(new { Message = $"Login Failed. {userLdapInfo.Response}" }); + } + + userInfo userInfo = userLdapInfo.UserInfo!; + + UserModel ldapuser = new UserModel() + { + FullName = userInfo!.Username, + UserName = userInfo.Email, + NormalizedUserName = userInfo.Email.ToUpper(), + Email = userInfo.Email, + NormalizedEmail = userInfo.Email.ToUpper(), + EmailConfirmed = true, + PhoneNumberConfirmed = false, + TwoFactorEnabled = false, + LockoutEnabled = false, + AccessFailedCount = 0, + }; + var existUser = await doUserExists(ldapuser.Email); + if (existUser == null) + { + await _userManager.CreateAsync(ldapuser); + //await _userManager.SetLockoutEnabledAsync(ldapuser, false); + //return RedirectToAction("AssignRoleAfterLdap", "IdentityController"); + return Ok(new { RedirectUrl = Url.Action("ComDeptAssignment", "Identity") }); + + }; + + await _signInManager.SignInAsync(existUser, false); + //return RedirectToAction("Index", "HomeController"); + return Ok(new { RedirectUrl = Url.Action("Index", "Home") }); + + } + + public async Task doUserExists(string username) + { + var user = await _userManager.FindByNameAsync(username); + return user != null ? user : null; + } + + class userLdapInfo() + { + public required bool Authenticated { get; set; } + public userInfo? UserInfo { get; set; } + public string? Response { get; set; } + } + class userInfo() + { + public required string FirstName { get; set; } + public required string LastName { get; set; } + public required string DisplayName { get; set; } + public required string Description { get; set; } + public required string Username { get; set; } + public required string Office { get; set; } + public required string Email { get; set; } + public required string Street { get; set; } + public required string City { get; set; } + public required string State { get; set; } + public required string ZipCode { get; set; } + public required string Country { get; set; } + public required string Home { get; set; } + public required string Mobile { get; set; } + + } } } diff --git a/Controllers/AdminController.cs b/Controllers/AdminController.cs index b11085a..84a6ac5 100644 --- a/Controllers/AdminController.cs +++ b/Controllers/AdminController.cs @@ -6,7 +6,7 @@ using System.Diagnostics; namespace PSTW_CentralSystem.Controllers { - //[Authorize(Policy = "RoleModulePolicy")] + [Authorize(Policy = "RoleModulePolicy")] public class AdminController : Controller { private readonly IdentityDBContext _authDbContext; diff --git a/Controllers/IdentityController.cs b/Controllers/IdentityController.cs index 1ebbc46..fbc69cd 100644 --- a/Controllers/IdentityController.cs +++ b/Controllers/IdentityController.cs @@ -2,6 +2,9 @@ using Microsoft.AspNetCore.Mvc; using PSTW_CentralSystem.DBContext; using PSTW_CentralSystem.Models; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; namespace PSTW_CentralSystem.Controllers { @@ -19,7 +22,7 @@ namespace PSTW_CentralSystem.Controllers _userManager = userManager; } - public async Task RoleAssignment() + public async Task ComDeptAssignment() { var thisUser = await _userManager.GetUserAsync(User); return View(thisUser.Id); diff --git a/Views/Admin/UserAdmin.cshtml b/Views/Admin/UserAdmin.cshtml index 05e7c77..52dbe7d 100644 --- a/Views/Admin/UserAdmin.cshtml +++ b/Views/Admin/UserAdmin.cshtml @@ -17,8 +17,7 @@

Latest Posts

- -
+
@@ -157,27 +156,6 @@ } ], responsive: true, - drawCallback: function (settings) { - // Generate QR codes after rows are rendered - const api = this.api(); - api.rows().every(function () { - const data = this.data(); // Row data - const containerId = `qr${data.uniqueID}`; - const container = $(`#${containerId}`); - // console.log(container[0]); - if (container) { - // Generate QR code only if not already generated - new QRCode(container[0], { - text: data.qrString, - width: 150, - height: 150, - colorDark: "#000000", - colorLight: "#ffffff", - correctLevel: QRCode.CorrectLevel.H - }); - } - }); - }, }) // Attach click event listener to the delete buttons diff --git a/Views/Identity/RoleAssignment.cshtml b/Views/Identity/ComDeptAssignment.cshtml similarity index 98% rename from Views/Identity/RoleAssignment.cshtml rename to Views/Identity/ComDeptAssignment.cshtml index d01e6e8..ff4841a 100644 --- a/Views/Identity/RoleAssignment.cshtml +++ b/Views/Identity/ComDeptAssignment.cshtml @@ -2,7 +2,7 @@ For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 *@ @{ - ViewData["Title"] = "Role Assignment"; + ViewData["Title"] = "Company & Department Assignment"; Layout = "~/Views/Shared/_Layout.cshtml"; int userId = ViewBag.UserId; } @@ -19,8 +19,7 @@

Latest Posts

- -
+
diff --git a/Views/Shared/_Layout.cshtml b/Views/Shared/_Layout.cshtml index 72a0ba5..0a5cbb7 100644 --- a/Views/Shared/_Layout.cshtml +++ b/Views/Shared/_Layout.cshtml @@ -70,6 +70,18 @@
+