2023-10-25 09:05:37 -05:00
|
|
|
|
using LdapLoginLib;
|
2023-02-02 10:50:02 -05:00
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
using Microsoft.IdentityModel.Tokens;
|
|
|
|
|
using MSAdminUsuarios.Context;
|
2023-10-25 09:05:37 -05:00
|
|
|
|
using Newtonsoft.Json.Linq;
|
2023-02-02 10:50:02 -05:00
|
|
|
|
using Security;
|
|
|
|
|
using System.IdentityModel.Tokens.Jwt;
|
2024-03-13 15:31:47 -05:00
|
|
|
|
using System.Reflection.Metadata;
|
2023-02-02 10:50:02 -05:00
|
|
|
|
using System.Security.Claims;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
namespace MSAdminUsuarios.Controllers
|
|
|
|
|
{
|
|
|
|
|
[ApiController]
|
|
|
|
|
[Route("[controller]")]
|
|
|
|
|
public class AuthController : ControllerBase
|
|
|
|
|
{
|
|
|
|
|
private readonly ModelContext _context;
|
|
|
|
|
private readonly Encripter _encript = new();
|
2024-04-29 09:51:35 -05:00
|
|
|
|
private readonly LDAP _ldap;
|
2024-03-13 15:31:47 -05:00
|
|
|
|
|
2023-02-02 10:50:02 -05:00
|
|
|
|
public AuthController(ModelContext context)
|
|
|
|
|
{
|
|
|
|
|
_context = context;
|
2024-04-29 09:51:35 -05:00
|
|
|
|
var loggerFactory = LoggerFactory.Create(builder =>
|
|
|
|
|
{
|
|
|
|
|
builder.AddConsole();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var logger = loggerFactory.CreateLogger<LDAP>();
|
|
|
|
|
|
|
|
|
|
_ldap = new LDAP(logger);
|
2023-02-02 10:50:02 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[HttpPost("Login")]
|
|
|
|
|
public IActionResult Login([FromBody] LoginModel login)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2024-04-29 09:51:35 -05:00
|
|
|
|
if (!_encript.IsValid) return BadRequest("Lectura inválida");
|
2023-02-02 10:50:02 -05:00
|
|
|
|
|
2024-03-13 15:31:47 -05:00
|
|
|
|
if (login.TX_LOGINNAME_USUMS == null) return BadRequest("Es necesario ingresar un usuario");
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
string.IsNullOrEmpty(login.TX_LOGINNAME_USUMS?.Trim()) &&
|
|
|
|
|
string.IsNullOrEmpty(login.TX_PKDOC_USUMS?.Trim()) &&
|
|
|
|
|
string.IsNullOrEmpty(login.TX_CORREO_USUMS?.Trim())
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("Es necesario ingresar un usuario.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (login.TX_PASSWORD_USUMS == null) return BadRequest("Es necesario ingresar una contraseña.");
|
2023-02-02 10:50:02 -05:00
|
|
|
|
|
2023-10-25 09:05:37 -05:00
|
|
|
|
USUARIO? userldap = _context.USUARIOSMs.FirstOrDefault(u => u.TX_LOGINNAME_USUMS == login.TX_LOGINNAME_USUMS);
|
2024-07-22 09:18:05 -05:00
|
|
|
|
if (userldap == null) return BadRequest("Nombre de usuario no encontrado.");
|
|
|
|
|
if (userldap.NU_ESTADO_USUMS != 1) return BadRequest("Usuarios inactivo o bloqueado.");
|
|
|
|
|
if (userldap.BL_VIENELDAP_USUMS == 1)
|
2023-10-25 09:05:37 -05:00
|
|
|
|
{
|
2024-03-13 15:31:47 -05:00
|
|
|
|
//bool boolldap = LoginLib.Login(login.TX_LOGINNAME_USUMS, login.TX_PASSWORD_USUMS);
|
|
|
|
|
bool loggedWithLdap = _ldap.Login(
|
|
|
|
|
username: login.TX_LOGINNAME_USUMS,
|
|
|
|
|
document: login.TX_PKDOC_USUMS,
|
|
|
|
|
email: login.TX_CORREO_USUMS,
|
|
|
|
|
password: login.TX_PASSWORD_USUMS
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (loggedWithLdap == true) {
|
2023-10-25 09:05:37 -05:00
|
|
|
|
string token = Token(userldap);
|
|
|
|
|
return Ok(new
|
|
|
|
|
{
|
|
|
|
|
token = token,
|
|
|
|
|
user = userldap.TX_PKDOC_USUMS
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return BadRequest();
|
|
|
|
|
}
|
|
|
|
|
}else if(userldap.BL_VIENELDAP_USUMS != 1)
|
|
|
|
|
{
|
|
|
|
|
USUARIO? user = _context.USUARIOSMs.FirstOrDefault(u => u.TX_LOGINNAME_USUMS == login.TX_LOGINNAME_USUMS && u.TX_PASSWORD_USUMS == _encript.EncryptPwd(login.TX_PASSWORD_USUMS));
|
2023-02-02 10:50:02 -05:00
|
|
|
|
|
2024-07-22 09:18:05 -05:00
|
|
|
|
if (user == null) return BadRequest("Usuario o contraseña incorrectos");
|
2023-02-02 10:50:02 -05:00
|
|
|
|
|
2023-10-25 09:05:37 -05:00
|
|
|
|
string token = Token(user);
|
|
|
|
|
|
|
|
|
|
return Ok(new
|
|
|
|
|
{
|
|
|
|
|
token = token,
|
|
|
|
|
user = user.TX_PKDOC_USUMS
|
|
|
|
|
});
|
|
|
|
|
}else
|
|
|
|
|
{
|
|
|
|
|
return BadRequest("Error");
|
|
|
|
|
}
|
2023-02-02 10:50:02 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
return BadRequest(e.Message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-14 12:05:16 -05:00
|
|
|
|
[HttpPost("CambiarClave")]
|
|
|
|
|
public IActionResult CambiarClave([FromBody] USUARIO us)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
USUARIO? user = _context.USUARIOSMs.FirstOrDefault(u => us.NU_PK_USUMS == u.NU_PK_USUMS);
|
|
|
|
|
|
|
|
|
|
if (user == null) return BadRequest("Usuario no encontrado.");
|
|
|
|
|
|
|
|
|
|
string newPass = _encript.EncryptPwd(us.TX_PASSWORD_USUMS!);
|
|
|
|
|
user.TX_PASSWORD_USUMS = newPass;
|
|
|
|
|
|
|
|
|
|
_context.USUARIOSMs.Update(user);
|
|
|
|
|
_context.SaveChanges();
|
|
|
|
|
|
2023-06-29 10:04:20 -05:00
|
|
|
|
return Ok("Contrase<73>a actualizada correctamente");
|
2023-02-14 12:05:16 -05:00
|
|
|
|
} catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
return Conflict(e.Message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-02 10:50:02 -05:00
|
|
|
|
[HttpPost("Proveedor")]
|
|
|
|
|
public IActionResult LoginProveedores([FromBody] LoginModel login)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2023-06-29 10:04:20 -05:00
|
|
|
|
if (!_encript.IsValid) return BadRequest(new ResLoginExt("Lectura inv<6E>lida"));
|
2023-02-02 10:50:02 -05:00
|
|
|
|
|
|
|
|
|
if (login.TX_LOGINNAME_USUMS == null) return BadRequest(new ResLoginExt("Es necesario ingresar un usuario"));
|
2023-06-29 10:04:20 -05:00
|
|
|
|
if (login.TX_PASSWORD_USUMS == null) return BadRequest(new ResLoginExt("Es necesario ingresar una contrase<73>a"));
|
2023-02-02 10:50:02 -05:00
|
|
|
|
|
|
|
|
|
USUARIO? userExist = _context.USUARIOSMs.FirstOrDefault(u => u.TX_LOGINNAME_USUMS == login.TX_LOGINNAME_USUMS);
|
2023-06-29 10:04:20 -05:00
|
|
|
|
if (userExist == null) return BadRequest(new ResLoginExt("Usuario o contrase<73>a incorrectos"));
|
2023-02-02 10:50:02 -05:00
|
|
|
|
|
|
|
|
|
USUARIO? user = _context.USUARIOSMs.FirstOrDefault(u => u.TX_LOGINNAME_USUMS == login.TX_LOGINNAME_USUMS && u.TX_PASSWORD_USUMS == _encript.EncryptPwd(login.TX_PASSWORD_USUMS));
|
|
|
|
|
|
2023-06-29 10:04:20 -05:00
|
|
|
|
if (user == null) return BadRequest(new ResLoginExt("Usuario o contrase<73>a incorrectos", true, userExist.NU_ESTADO_USUMS));
|
2023-02-02 10:50:02 -05:00
|
|
|
|
|
|
|
|
|
if (user.NU_ESTADO_USUMS != 1) return BadRequest(new ResLoginExt("Usuario inactivo o eliminado.", true, user.NU_ESTADO_USUMS));
|
|
|
|
|
|
|
|
|
|
string token = Token(user);
|
|
|
|
|
|
|
|
|
|
return Ok(new ResLoginExt("Bienvenido al sistema.", true, user.NU_ESTADO_USUMS, token));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
return BadRequest(e.Message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[HttpPatch("RenovarToken")]
|
|
|
|
|
public IActionResult RefreshToken([FromBody] string token)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2023-02-02 11:21:46 -05:00
|
|
|
|
#warning este metodo se debe revisar, des-encriptado no se debe permitir!
|
|
|
|
|
|
2023-02-02 10:50:02 -05:00
|
|
|
|
JwtSecurityTokenHandler handler = new();
|
|
|
|
|
JwtSecurityToken tkn = handler.ReadJwtToken(Encripter.Descypher(token));
|
|
|
|
|
int pk = Int32.Parse(tkn.Claims.FirstOrDefault(c => c.Type == "pk").Value);
|
|
|
|
|
|
|
|
|
|
USUARIO? user = _context.USUARIOSMs.FirstOrDefault(u => u.NU_PK_USUMS == pk);
|
|
|
|
|
|
|
|
|
|
if (user == null) return BadRequest("No se encuentra usuario");
|
|
|
|
|
|
|
|
|
|
string newToken = Token(user);
|
|
|
|
|
return Ok(newToken);
|
|
|
|
|
|
|
|
|
|
} catch(Exception ex)
|
|
|
|
|
{
|
|
|
|
|
return BadRequest(ex.Message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[HttpGet("Encriptar")]
|
|
|
|
|
public IActionResult Encriptar(string text, int tipo)
|
|
|
|
|
{
|
2023-06-29 10:04:20 -05:00
|
|
|
|
if (!_encript.IsValid) return BadRequest("Lectura inv<6E>lida");
|
2023-02-02 10:50:02 -05:00
|
|
|
|
|
|
|
|
|
if (tipo == 0) return Ok(_encript.EncryptPwd(text));
|
|
|
|
|
|
|
|
|
|
return Ok(_encript.EncryptHashTkn(text));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[HttpGet("Desencriptar")]
|
|
|
|
|
public IActionResult Desencriptar(string text, int tipo)
|
|
|
|
|
{
|
2023-06-29 10:04:20 -05:00
|
|
|
|
if (!_encript.IsValid) return BadRequest("Lectura inv<6E>lida");
|
2023-02-02 10:50:02 -05:00
|
|
|
|
|
|
|
|
|
if (tipo == 0) return Ok(_encript.DecryptPwd(text));
|
|
|
|
|
|
|
|
|
|
return Ok(_encript.DecryptHashTkn(text));
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-14 12:05:16 -05:00
|
|
|
|
[HttpGet("TknCambioClave")]
|
|
|
|
|
public IActionResult ObtenerTokenCambioClave(int pkUs)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
return Ok(TokenCambioClave(pkUs));
|
|
|
|
|
} catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
return BadRequest(e.Message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-09 14:09:37 -05:00
|
|
|
|
[HttpPost("pruebaUsuario")]
|
|
|
|
|
public string Token(USUARIO user)
|
2023-02-02 10:50:02 -05:00
|
|
|
|
{
|
|
|
|
|
List<PERFILPORUSUARIO> perfilesPorUsuario = (from perf in _context.PERFILESPORUSUARIOs
|
|
|
|
|
where perf.TX_FKDOC_USUMS == user.TX_PKDOC_USUMS && perf.NU_FK_PFL != null && perf.BL_ESTADO_PFLXUSU == 1
|
|
|
|
|
select perf).ToList();
|
|
|
|
|
|
|
|
|
|
List<int?> perfiles = perfilesPorUsuario.Select(p => p.NU_FK_PFL).ToList();
|
|
|
|
|
|
|
|
|
|
List<PERMISO> permisos = (from perfXUs in perfilesPorUsuario
|
|
|
|
|
join perm in _context.PERMISOSMs on perfXUs.NU_FK_PFL equals perm.NU_FK_PFL
|
|
|
|
|
where perm.BL_ESTADO_PMS == 1
|
|
|
|
|
select perm).ToList();
|
|
|
|
|
|
|
|
|
|
Dictionary<string, string> perfilesPorPermiso = new();
|
|
|
|
|
foreach (PERMISO p in permisos)
|
|
|
|
|
{
|
|
|
|
|
string key = p.NU_FK_MS.ToString();
|
|
|
|
|
string val = p.NU_FK_PFL.ToString();
|
|
|
|
|
|
|
|
|
|
if (perfilesPorPermiso.ContainsKey(key))
|
|
|
|
|
{
|
|
|
|
|
string antVal = perfilesPorPermiso[key];
|
|
|
|
|
perfilesPorPermiso.Remove(key);
|
|
|
|
|
perfilesPorPermiso.Add(key, antVal + "," + val);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
perfilesPorPermiso.Add(key, val);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
perfiles.Add(-1);
|
|
|
|
|
|
|
|
|
|
//Security key debe ser un environment variable seguro
|
|
|
|
|
var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Encripter.HashKey));
|
|
|
|
|
var signingCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);
|
|
|
|
|
string nombres = "";
|
|
|
|
|
string apellidos = "";
|
|
|
|
|
|
|
|
|
|
if (user.TX_PRIMERNOM_USUMS != null) nombres += user.TX_PRIMERNOM_USUMS;
|
|
|
|
|
if (user.TX_SEGUNDONOM_USUMS != null) nombres += " " + user.TX_SEGUNDONOM_USUMS;
|
|
|
|
|
if (user.TX_PRIMERAPELL_USUMS != null) apellidos += user.TX_PRIMERAPELL_USUMS;
|
|
|
|
|
if (user.TX_SEGUNDOAPELL_USUMS != null) apellidos += " " + user.TX_SEGUNDOAPELL_USUMS;
|
|
|
|
|
|
|
|
|
|
nombres = nombres.Trim();
|
|
|
|
|
apellidos = apellidos.Trim();
|
|
|
|
|
|
|
|
|
|
if (nombres == "") nombres = "N";
|
|
|
|
|
if (apellidos == "") apellidos = "A";
|
|
|
|
|
|
|
|
|
|
int tipo_doc = user.NU_TIPODOC_USUMS == null ? -1 : (int)user.NU_TIPODOC_USUMS;
|
|
|
|
|
|
|
|
|
|
ClaimsIdentity claims = new ClaimsIdentity(new List<Claim>
|
|
|
|
|
{
|
|
|
|
|
new Claim("user", user.TX_PKDOC_USUMS),
|
|
|
|
|
new Claim("nombres", nombres),
|
|
|
|
|
new Claim("apellidos", apellidos),
|
|
|
|
|
new Claim("tipo_doc", tipo_doc.ToString()),
|
2023-03-09 14:09:37 -05:00
|
|
|
|
new Claim("pk", user.NU_PK_USUMS.ToString()),
|
2023-06-29 10:04:20 -05:00
|
|
|
|
new Claim("sedes", user.TX_SEDES_USUMS == null ? "" : user.TX_SEDES_USUMS),
|
2024-03-13 15:31:47 -05:00
|
|
|
|
new Claim("TX_NOMBRE_PVD", user.TX_NOMBRE_PVD ?? "{}"),
|
|
|
|
|
new Claim("uid", user.TX_UUID_USUMS.ToString())
|
2023-02-02 10:50:02 -05:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (int p in perfiles)
|
|
|
|
|
{
|
|
|
|
|
claims.AddClaim(new Claim("perfiles", p.ToString(), ClaimValueTypes.String));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//foreach (PERMISO p in permisos)
|
|
|
|
|
//{
|
|
|
|
|
// claims.AddClaim(new Claim("permisos", Encripter.Encrypt(p.NU_FK_MS.ToString())));
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
foreach (KeyValuePair<string, string> p in perfilesPorPermiso)
|
|
|
|
|
{
|
|
|
|
|
string key = p.Key;
|
|
|
|
|
string val = p.Value;
|
|
|
|
|
|
|
|
|
|
claims.AddClaim(new Claim("permisos", _encript.EncryptHashTkn(key) + "::" + val));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var securityTokenDescriptor = new SecurityTokenDescriptor
|
|
|
|
|
{
|
|
|
|
|
Subject = claims,
|
|
|
|
|
Expires = DateTime.Now.AddDays(20),
|
|
|
|
|
SigningCredentials = signingCredentials
|
2023-02-14 12:05:16 -05:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
|
|
|
|
|
var securityToken = jwtSecurityTokenHandler.CreateToken(securityTokenDescriptor);
|
|
|
|
|
var token = jwtSecurityTokenHandler.WriteToken(securityToken);
|
|
|
|
|
|
|
|
|
|
return Encripter.Cypher(token);
|
|
|
|
|
}
|
2024-07-24 11:58:06 -05:00
|
|
|
|
|
|
|
|
|
[HttpPatch("BloquearUsuario")]
|
|
|
|
|
public IActionResult BloquearUsuario([FromBody] string usuario)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (usuario == null) throw new Exception("Usuario no encontrado");
|
2024-07-25 17:16:14 -05:00
|
|
|
|
USUARIO? user = _context.USUARIOSMs.FirstOrDefault(u => u.TX_LOGINNAME_USUMS == usuario);
|
|
|
|
|
if (user == null) throw new Exception("Usuario no encontrado");
|
|
|
|
|
user.NU_BLOQUEO_USUMS = 0;
|
|
|
|
|
user.NU_ESTADO_USUMS = 2;
|
2024-07-24 11:58:06 -05:00
|
|
|
|
|
2024-07-25 17:16:14 -05:00
|
|
|
|
_context.USUARIOSMs.Update(user);
|
|
|
|
|
_context.SaveChanges();
|
|
|
|
|
|
|
|
|
|
return Ok(new { message = "Su cuenta ha sido bloqueada debido a demasiados intentos fallidos" });
|
2024-07-24 11:58:06 -05:00
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
2024-07-25 17:16:14 -05:00
|
|
|
|
return BadRequest(new { message = ex.Message });
|
2024-07-24 11:58:06 -05:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-14 12:05:16 -05:00
|
|
|
|
string TokenCambioClave(int pkUser)
|
|
|
|
|
{
|
|
|
|
|
USUARIO? user = _context.USUARIOSMs.FirstOrDefault(u => pkUser == u.NU_PK_USUMS);
|
|
|
|
|
if (user == null) throw new Exception("Usuario no encontrado");
|
|
|
|
|
|
|
|
|
|
//Security key debe ser un environment variable seguro
|
|
|
|
|
var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Encripter.HashKey));
|
|
|
|
|
var signingCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ClaimsIdentity claims = new ClaimsIdentity(new List<Claim>
|
|
|
|
|
{
|
|
|
|
|
new Claim("user", user.TX_PKDOC_USUMS),
|
|
|
|
|
new Claim("loginName", user.TX_LOGINNAME_USUMS),
|
|
|
|
|
new Claim("pk", user.NU_PK_USUMS.ToString())
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var securityTokenDescriptor = new SecurityTokenDescriptor
|
|
|
|
|
{
|
|
|
|
|
Subject = claims,
|
2023-02-14 18:01:33 -05:00
|
|
|
|
Expires = DateTime.UtcNow.AddMinutes(20),
|
2023-02-14 12:05:16 -05:00
|
|
|
|
SigningCredentials = signingCredentials
|
2023-02-02 10:50:02 -05:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
|
|
|
|
|
var securityToken = jwtSecurityTokenHandler.CreateToken(securityTokenDescriptor);
|
|
|
|
|
var token = jwtSecurityTokenHandler.WriteToken(securityToken);
|
|
|
|
|
|
|
|
|
|
return Encripter.Cypher(token);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class LoginModel
|
|
|
|
|
{
|
|
|
|
|
public string? TX_LOGINNAME_USUMS { get; set; }
|
2024-03-13 15:31:47 -05:00
|
|
|
|
public string? TX_CORREO_USUMS { get; set; }
|
|
|
|
|
public string? TX_PKDOC_USUMS { get; set; }
|
2023-02-02 10:50:02 -05:00
|
|
|
|
public string? TX_PASSWORD_USUMS { get; set; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class ResLoginExt
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
public ResLoginExt(string _message, bool _exist = false, int? _estado = null, string? _token = "")
|
|
|
|
|
{
|
|
|
|
|
Message = _message;
|
|
|
|
|
Token = _token;
|
|
|
|
|
Existe = _exist;
|
|
|
|
|
Estado = _estado;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool Existe { get; set; }
|
|
|
|
|
public int? Estado { get; set; }
|
|
|
|
|
public string? Token { get; set; }
|
|
|
|
|
public string Message { get; set; } = null!;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static class Options
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|