LoginDing / wwwroot / Account / Login.cshtml.cs
Code · 70 lines · 2151 bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;

namespace LoginDing.wwwroot.Account;

public class LoginController(IConfiguration configuration) : Controller
{

	[HttpGet("~/Account/Login")]
	public IActionResult Index() => View("/wwwroot/Account/Login.cshtml");

	[HttpGet("~/Account/AccessDenied")]
	public IActionResult AccessDenied() => View("/wwwroot/Account/AccessDenied.cshtml");

	[HttpGet("~/Account/Logout")]
	public async Task<IActionResult> Logout()
	{
		await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

		return RedirectToAction("Index", "Login");
	}

	// User configuration model for appsettings.json
	public class UserConfig
	{
		public string? UserName { get; set; }
		public string? Password { get; set; }
		public string? Role { get; set; }
		public int ExpireDays { get; set; } = 365;
	}

	[HttpPost("~/Account/Login")]
	public async Task<IActionResult> Login()
	{
		var username = Request.Form["username"];
		var password = Request.Form["password"];

		// Load users from appsettings.json
		var users = configuration.GetSection("MaintenanceUsers").Get<List<UserConfig>>();
		var user = users?.FirstOrDefault(u => u.UserName == username && u.Password == password);

		TempData["ErrorMessage"] = "";

		if (user != null)
		{
			// Add claims including role
			List<Claim> claims =
			[
				new Claim(ClaimTypes.Name, username!),
				new Claim("CustomClaim", "UserRole"),
				new Claim(ClaimTypes.Role, user.Role ?? "User") // Add role claim
            ];
			var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
			var authProperties = new AuthenticationProperties
			{
				IsPersistent = true,
				ExpiresUtc = DateTimeOffset.UtcNow.AddDays(user.ExpireDays)
			};

			await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);

			return Redirect("/");
		}
		TempData["ErrorMessage"] = "Invalid login attempt";

		return RedirectToAction("Index", "Login");
	}
}