using System.ComponentModel.DataAnnotations; using System.Security.Claims; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using MySql.Data.MySqlClient; namespace HelpDesk.Pages { public class LoginModel : PageModel { private readonly IConfiguration _configuration; public LoginModel(IConfiguration configuration) { _configuration = configuration; } [BindProperty] [Required(ErrorMessage = "Por favor, ingrese su DNI.")] [StringLength(8, MinimumLength = 8, ErrorMessage = "El DNI debe tener 8 dígitos.")] public string Dni { get; set; } = string.Empty; [BindProperty] [Required(ErrorMessage = "Por favor, ingrese su contraseña.")] public string Password { get; set; } = string.Empty; [BindProperty] public bool EsMonitor { get; set; } public string? MensajeError { get; set; } public bool LoginExitoso { get; set; } public string NombreUsuarioModal { get; set; } = string.Empty; public string HoraIngresoModal { get; set; } = string.Empty; public void OnGet() { MensajeError = null; LoginExitoso = false; } public async Task OnPostAsync() { if (!ModelState.IsValid) { return Page(); } string connectionString = _configuration.GetConnectionString("MySqlHelpDesk") ?? string.Empty; try { using (var con = new MySqlConnection(connectionString)) { await con.OpenAsync(); string query = EsMonitor ? "SELECT dni, nombre, dite FROM tb_usuarios WHERE dni = @DNI AND password = @Password AND dite = 1" : "SELECT dni, nombre, dite FROM tb_usuarios WHERE dni = @DNI AND password = @Password AND dite = 0"; using (var cmd = new MySqlCommand(query, con)) { cmd.Parameters.AddWithValue("@DNI", Dni); cmd.Parameters.AddWithValue("@Password", Password); using (var dr = await cmd.ExecuteReaderAsync()) { if (await dr.ReadAsync()) { string nombreUsuario = dr["nombre"].ToString()?.ToUpper() ?? string.Empty; string horaIngreso = DateTime.Now.ToString("hh:mm:ss tt"); int diteValor = Convert.ToInt32(dr["dite"]); // Crear claims de autenticación del usuario (Reemplaza a las variables de Session tradicional) var claims = new List { new Claim(ClaimTypes.NameIdentifier, Dni), new Claim(ClaimTypes.Name, nombreUsuario), new Claim("HoraIngreso", horaIngreso), new Claim("UsuarioDite", diteValor.ToString()) }; var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); // Iniciar sesión con Cookie cifrada await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity)); // Datos para mostrar en la ventana modal de bienvenida LoginExitoso = true; NombreUsuarioModal = nombreUsuario; HoraIngresoModal = horaIngreso; return Page(); } else { MensajeError = EsMonitor ? "Credenciales incorrectas o el usuario no tiene permisos de Monitor." : "DNI o contraseña incorrectos."; return Page(); } } } } } catch (Exception ex) { MensajeError = "Error de conexión: " + ex.Message; return Page(); } } } }