2023-10-25 09:05:37 -05:00
using LdapLoginLib ;
2023-02-02 10:50:02 -05:00
using Microsoft.AspNetCore.Mvc ;
2024-10-28 13:54:17 -05:00
using Microsoft.Extensions.Logging ;
2023-02-02 10:50:02 -05:00
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-09-23 08:54:57 -05:00
private readonly ILogger < AuthController > _logger ;
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 > ( ) ;
2024-09-23 08:54:57 -05:00
_logger = loggerFactory . CreateLogger < AuthController > ( ) ;
2024-04-29 09:51:35 -05:00
_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 ,
2024-08-26 11:01:08 -05:00
user = userldap . TX_PKDOC_USUMS ,
ldap = 1
2023-10-25 09:05:37 -05:00
} ) ;
}
else
{
return BadRequest ( ) ;
}
2024-08-26 11:01:08 -05:00
} else if ( userldap . BL_VIENELDAP_USUMS ! = 1 ) //return BadRequest(new ResLoginExt("No eres un usuario interno.", true, userldap.NU_ESTADO_USUMS));
2023-10-25 09:05:37 -05:00
{
2024-08-26 11:01:08 -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 ) ) ;
if ( user = = null ) return BadRequest ( "Usuario o contraseña incorrectos" ) ; * /
2023-02-02 10:50:02 -05:00
2024-08-26 11:01:08 -05:00
//if (userldap.BL_VIENELDAP_USUMS != 1)
return BadRequest ( "No eres un usuario interno" ) ;
2023-02-02 10:50:02 -05:00
2024-08-26 11:01:08 -05:00
/ * string token = Token ( user ) ;
2023-10-25 09:05:37 -05:00
return Ok ( new
{
token = token ,
2024-08-26 11:01:08 -05:00
user = user . TX_PKDOC_USUMS ,
primera = user . NU_INICIO_PRIMERAVEZ_USUMS ,
ldap = 0
} ) ; * /
2023-10-25 09:05:37 -05:00
} else
{
return BadRequest ( "Error" ) ;
}
2023-02-02 10:50:02 -05:00
} catch ( Exception e )
{
return BadRequest ( e . Message ) ;
}
}
2024-08-26 11:01:08 -05:00
/ * [ HttpPost ( "CambiarClave_old" ) ]
2023-02-14 12:05:16 -05:00
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 ) ;
}
2024-08-26 11:01:08 -05:00
} * /
2023-02-14 12:05:16 -05:00
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 ) ) ;
2024-08-26 11:01:08 -05:00
if ( user = = null ) return BadRequest ( new ResLoginExt ( "Usuario o contraseña incorrectos" , true , userExist . NU_ESTADO_USUMS ) ) ;
2023-02-02 10:50:02 -05:00
2024-09-23 08:54:57 -05:00
//if (user.NU_ESTADO_USUMS == null) return BadRequest(new ResLoginExt("Usuario eliminado.", true, user.NU_ESTADO_USUMS));
if ( user . NU_ESTADO_USUMS = = 0 ) return BadRequest ( new ResLoginExt ( "Usuario inactivo." , true , user . NU_ESTADO_USUMS ) ) ;
if ( user . NU_ESTADO_USUMS = = 2 ) return BadRequest ( new ResLoginExt ( "Usuario bloqueado." , true , user . NU_ESTADO_USUMS ) ) ;
2023-02-02 10:50:02 -05:00
2024-08-26 11:01:08 -05:00
if ( user . BL_VIENELDAP_USUMS ! = 0 ) return BadRequest ( new ResLoginExt ( "No eres un usuario externo." , true , user . NU_ESTADO_USUMS ) ) ;
2023-02-02 10:50:02 -05:00
2024-09-23 08:54:57 -05:00
//if (user.FE_RECUPERACLAVE < DateTime.Now) return BadRequest(new ResLoginExt("La recuperación de contraseña esta caducada.", true, user.NU_ESTADO_USUMS));
//string fechaConvertidaBase = user.FE_RECUPERACLAVE.ToString("dd/MM/yy");
if ( user . FE_RECUPERACLAVE ! = null )
{
DateTime fecha1 = ( DateTime ) user . FE_RECUPERACLAVE ;
DateTime fecha2 = DateTime . Now ;
TimeSpan diferencia = fecha2 - fecha1 ;
if ( diferencia . TotalHours > 24 )
{
//Console.WriteLine("La diferencia es de al menos 24 horas.");
return BadRequest ( new ResLoginExt ( "La recuperación de contraseña esta caducada." , true , user . NU_ESTADO_USUMS ) ) ;
}
}
//else
//{
// Console.WriteLine("La diferencia es menor a 24 horas.");
//}
//string fechaConvertidaBase = user.FE_RECUPERACLAVE.HasValue? user.FE_RECUPERACLAVE.Value.ToString("dd/MM/yy"): "Fecha no disponible";
//string fechaConvertidaActual = DateTime.Now.ToString("dd/MM/yy");
//if (fechaConvertidaBase != null && fechaConvertidaBase != fechaConvertidaActual) return BadRequest(new ResLoginExt("La recuperación de contraseña esta caducada.", true, user.NU_ESTADO_USUMS));
//this._logger.LogWarning(user.FE_RECUPERACLAVE.ToString());
//DateTime fecha1 = user.FE_RECUPERACLAVE;
//if (fechaConvertidaBase != null && fechaConvertidaBase != fechaConvertidaActual) return BadRequest(new ResLoginExt("La recuperación de contraseña esta caducada.", true, user.NU_ESTADO_USUMS));
//if (user.FE_RECUPERACLAVE != null) {
// ///////////////////////////////////////////////////////
// DateTime fechaHoy = DateTime.Now;
// int diaDiasAntes = fechaHoy.Day;
// int mesDiasAntes = fechaHoy.Month;
// int anioDiasAntes = fechaHoy.Year;
// int horas = fechaHoy.Hour;
// int minutos = fechaHoy.Minute;
// int segundos = fechaHoy.Second;
// int milisegs = fechaHoy.Millisecond;
// ///////////////////////////////////////////////////////
// int dia = user.FE_RECUPERACLAVE.Value.Day;
// int mes = user.FE_RECUPERACLAVE.Value.Month;
// int año = user.FE_RECUPERACLAVE.Value.Year;
// int horasSEG = user.FE_RECUPERACLAVE.Value.Hour;
// int minutosSEG = user.FE_RECUPERACLAVE.Value.Minute;
// int segundosSEG = user.FE_RECUPERACLAVE.Value.Second;
// int milisegsSEG = user.FE_RECUPERACLAVE.Value.Millisecond;
// if (user.FE_RECUPERACLAVE < DateTime.Now) return BadRequest(new ResLoginExt("La recuperación de contraseña esta caducada.", true, user.NU_ESTADO_USUMS));
//}
//else
//{
//}
2023-02-02 10:50:02 -05:00
string token = Token ( user ) ;
2024-09-23 08:54:57 -05:00
user . FE_RECUPERACLAVE = null ;
_context . USUARIOSMs . Update ( user ) ;
_context . SaveChanges ( ) ;
2023-02-02 10:50:02 -05:00
2024-08-26 11:01:08 -05:00
return Ok ( new ResLoginExt ( "Bienvenido al sistema." , true , user . NU_ESTADO_USUMS , token , user . NU_INICIO_PRIMERAVEZ_USUMS , user . TX_PKDOC_USUMS , user . BL_VIENELDAP_USUMS ) ) ;
2023-02-02 10:50:02 -05:00
}
catch ( Exception e )
{
return BadRequest ( e . Message ) ;
}
}
2024-09-23 08:54:57 -05:00
[HttpPost("RecuperarClave")]
public IActionResult RecuperarClave ( [ FromBody ] string usuario )
{
try
{
if ( usuario = = null ) throw new Exception ( "Usuario no encontrado" ) ;
if ( usuario = = null ) return BadRequest ( new ResLoginExt ( "Es necesario ingresar un usuario" ) ) ;
USUARIO ? userExist = _context . USUARIOSMs . FirstOrDefault ( u = > u . TX_LOGINNAME_USUMS = = usuario ) ;
if ( userExist = = null ) return BadRequest ( new ResLoginExt ( "Este usuario no existe" ) ) ;
if ( userExist . NU_ESTADO_USUMS = = 0 ) return BadRequest ( new ResLoginExt ( "Usuario inactivo." , true , userExist . NU_ESTADO_USUMS ) ) ;
if ( userExist . NU_ESTADO_USUMS = = 2 ) return BadRequest ( new ResLoginExt ( "Usuario bloqueado." , true , userExist . NU_ESTADO_USUMS ) ) ;
if ( userExist . BL_VIENELDAP_USUMS ! = 0 ) return BadRequest ( new ResLoginExt ( "No es un usuario externo." , true , userExist . NU_ESTADO_USUMS ) ) ;
//string token = Token(user);
userExist . FE_RECUPERACLAVE = DateTime . Now ;
2024-10-03 09:00:57 -05:00
userExist . NU_INICIO_PRIMERAVEZ_USUMS = 0 ;
2024-09-23 08:54:57 -05:00
string RecuperaIdGenerada = AuthController . RecuperaIdGenerada ( 8 ) ;
userExist . TX_PASSWORD_USUMS = _encript . EncryptPwd ( RecuperaIdGenerada ) ;
_context . USUARIOSMs . Update ( userExist ) ;
_context . SaveChanges ( ) ;
return Ok ( new RecuperarClaveModel ( "Se enviará un correo para continuar el proceso." , true , userExist . NU_ESTADO_USUMS , userExist . TX_CORREO_USUMS , RecuperaIdGenerada ) ) ;
}
catch ( Exception e )
{
return BadRequest ( e . Message ) ;
}
}
2023-02-02 10:50:02 -05:00
[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 ) ;
}
}
2024-11-16 09:35:32 -05:00
// **** Original
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 ( ) ;
2024-11-06 09:41:10 -05:00
2024-10-28 13:54:17 -05:00
_logger . LogInformation ( perfilesPorUsuario . ToString ( ) ) ;
2023-02-02 10:50:02 -05:00
List < int? > perfiles = perfilesPorUsuario . Select ( p = > p . NU_FK_PFL ) . ToList ( ) ;
2024-11-16 09:35:32 -05:00
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 ( ) ;
2023-02-02 10:50:02 -05:00
Dictionary < string , string > perfilesPorPermiso = new ( ) ;
2024-11-16 09:35:32 -05:00
foreach ( PERMISO p in permisos )
2023-02-02 10:50:02 -05:00
{
2024-11-16 09:35:32 -05:00
string key = p . NU_FK_MS . ToString ( ) ;
string val = p . NU_FK_PFL . ToString ( ) ;
2024-11-06 09:41:10 -05:00
2024-11-16 09:35:32 -05:00
if ( perfilesPorPermiso . ContainsKey ( key ) )
{
string antVal = perfilesPorPermiso [ key ] ;
perfilesPorPermiso . Remove ( key ) ;
perfilesPorPermiso . Add ( key , antVal + "," + val ) ;
}
else
{
perfilesPorPermiso . Add ( key , val ) ;
2023-02-02 10:50:02 -05:00
}
}
perfiles . Add ( - 1 ) ;
2024-11-16 09:35:32 -05:00
//Security key debe ser un environment variable seguro
2023-02-02 10:50:02 -05:00
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 >
2024-11-16 09:35:32 -05:00
{
new Claim ( "user" , user . TX_PKDOC_USUMS ) ,
new Claim ( "nombres" , nombres ) ,
new Claim ( "apellidos" , apellidos ) ,
new Claim ( "tipo_doc" , tipo_doc . ToString ( ) ) ,
new Claim ( "pk" , user . NU_PK_USUMS . ToString ( ) ) ,
new Claim ( "sedes" , user . TX_SEDES_USUMS = = null ? "" : user . TX_SEDES_USUMS ) ,
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 ) ) ;
}
2024-11-16 09:35:32 -05:00
//foreach (PERMISO p in permisos)
//{
// claims.AddClaim(new Claim("permisos", Encripter.Encrypt(p.NU_FK_MS.ToString())));
//}
foreach ( KeyValuePair < string , string > p in perfilesPorPermiso )
2023-02-02 10:50:02 -05:00
{
2024-11-16 09:35:32 -05:00
string key = p . Key ;
string val = p . Value ;
claims . AddClaim ( new Claim ( "permisos" , _encript . EncryptHashTkn ( key ) + "::" + val ) ) ;
2023-02-02 10:50:02 -05:00
}
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-11-16 09:35:32 -05:00
// **** Original
//[HttpPost("pruebaUsuario")]
//public string Token(USUARIO user)
//{
// 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();
// _logger.LogInformation(perfilesPorUsuario.ToString());
// List<int?> perfiles = perfilesPorUsuario.Select(p => p.NU_FK_PFL).ToList();
// // Verificar si alguno de los perfiles es 2
// bool perfilEsDos = perfiles.Contains(2);
// // Solo obtenemos permisos si no existe el perfil 2
// List<PERMISO> permisos = perfilEsDos ? new List<PERMISO>() :
// (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();
// // Todos
// if (!perfilEsDos) // Solo procesar permisos si el perfil no es 2
// {
// 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[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()),
// new Claim("pk", user.NU_PK_USUMS.ToString()),
// new Claim("sedes", user.TX_SEDES_USUMS ?? ""),
// new Claim("TX_NOMBRE_PVD", user.TX_NOMBRE_PVD ?? "{}"),
// new Claim("uid", user.TX_UUID_USUMS.ToString())
//});
// foreach (int p in perfiles)
// {
// claims.AddClaim(new Claim("perfiles", p.ToString(), ClaimValueTypes.String));
// }
// if (!perfilEsDos) // Añadir permisos solo si perfil no es 2
// {
// 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
// };
// 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
2024-11-06 09:41:10 -05:00
//[HttpPost("pruebaUsuario")]
//public string Token(USUARIO user)
//{
// 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();
// _logger.LogInformation(perfilesPorUsuario.ToString());
// 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>
// {
2024-11-16 09:35:32 -05:00
// new Claim("us", user.TX_PKDOC_USUMS),
// new Claim("nm", nombres),
// new Claim("ap", apellidos),
// new Claim("td", tipo_doc.ToString()),
2024-11-06 09:41:10 -05:00
// new Claim("pk", user.NU_PK_USUMS.ToString()),
2024-11-16 09:35:32 -05:00
// new Claim("s", user.TX_SEDES_USUMS == null ? "" : user.TX_SEDES_USUMS),
// new Claim("PVD", user.TX_NOMBRE_PVD ?? "{}"),
2024-11-06 09:41:10 -05:00
// new Claim("uid", user.TX_UUID_USUMS.ToString())
// });
// 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;
2024-11-16 09:35:32 -05:00
// claims.AddClaim(new Claim("prm", _encript.EncryptHashTkn(key) + "|" + val));
2024-11-06 09:41:10 -05:00
// }
// var securityTokenDescriptor = new SecurityTokenDescriptor
// {
// Subject = claims,
// Expires = DateTime.Now.AddDays(20),
// SigningCredentials = signingCredentials
// };
// 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" ) ;
2024-08-26 11:01:08 -05:00
//user.NU_BLOQUEO_USUMS = 0;
2024-07-25 17:16:14 -05:00
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 ( ) ;
2024-08-26 11:01:08 -05:00
//return Ok(new { message = "Su cuenta ha sido bloqueada debido a demasiados intentos fallidos" });
//return Ok("Su cuenta ha sido bloqueada debido a demasiados intentos fallidos");
return Ok ( new ResLoginExt ( "Su cuenta ha sido bloqueada debido a demasiados intentos fallidos." , true ) ) ;
2024-07-24 11:58:06 -05:00
}
catch ( Exception ex )
{
2024-08-26 11:01:08 -05:00
//return BadRequest(new { message = ex.Message });
//return BadRequest(ex.Message);
return BadRequest ( new ResLoginExt ( ex . Message , true ) ) ;
}
}
[HttpPost("CambiarClave")]
public IActionResult CambiarClave ( [ FromBody ] CambiarClaveModel model )
{
if ( model . NewPassword ! = model . ConfirmPassword )
{
return BadRequest ( "Las contraseñas no coinciden." ) ;
}
try
{
if ( model = = null ) throw new Exception ( "No se recibieron datos" ) ;
USUARIO ? user = _context . USUARIOSMs . FirstOrDefault ( u = > u . TX_LOGINNAME_USUMS = = model . User ) ;
if ( user = = null ) return BadRequest ( "Usuario no encontrado." ) ;
string newPass = _encript . EncryptPwd ( model . NewPassword ! ) ;
user . TX_PASSWORD_USUMS = newPass ;
user . NU_INICIO_PRIMERAVEZ_USUMS = 1 ;
_context . USUARIOSMs . Update ( user ) ;
_context . SaveChanges ( ) ;
//return Ok("Contrase<73> a restablecida con éxito.");
//return Ok(new { message = "Contrase<73> a restablecida con éxito." });
return Ok ( new ResLoginExt ( "Contrase<73> a restablecida con éxito." , true ) ) ;
}
catch ( Exception ex )
{
//return Conflict(e.Message);
//return BadRequest(new { message = ex.Message });
return BadRequest ( 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 ) ;
}
2024-09-23 08:54:57 -05:00
public static string RecuperaIdGenerada ( int length )
{
// Validar que la longitud sea positiva
if ( length < = 0 )
{
throw new ArgumentException ( "La longitud debe ser mayor que 0." ) ;
}
2024-10-03 09:00:57 -05:00
// Definir un conjunto de caracteres que incluya letras, números y caracteres especiales
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+-=[]{}|;':,.<>?" ;
2024-09-23 08:54:57 -05:00
// Crear una instancia de Random
Random random = new Random ( ) ;
// Generar una cadena aleatoria de números
2024-10-03 09:00:57 -05:00
//string result = "";
//for (int i = 0; i < length; i++)
//{
//result += random.Next(0, 10).ToString(); // Generar un dígito aleatorio
//}
// Generar una cadena aleatoria de caracteres
string result = new string ( Enumerable . Repeat ( chars , length ) . Select ( s = > s [ random . Next ( s . Length ) ] ) . ToArray ( ) ) ;
2024-09-23 08:54:57 -05:00
return result ;
}
2023-02-02 10:50:02 -05:00
}
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
{
2024-08-26 11:01:08 -05:00
public ResLoginExt ( string _message , bool _exist = false , int? _estado = null , string? _token = "" , int? _primera = null , string? _user = "" , int? _ldap = null )
2023-02-02 10:50:02 -05:00
{
Message = _message ;
Token = _token ;
Existe = _exist ;
Estado = _estado ;
2024-08-26 11:01:08 -05:00
Primera = _primera ;
User = _user ;
Ldap = _ldap ;
2024-09-23 08:54:57 -05:00
//ClaveRec = _claveRec;
2023-02-02 10:50:02 -05:00
}
public bool Existe { get ; set ; }
public int? Estado { get ; set ; }
public string? Token { get ; set ; }
public string Message { get ; set ; } = null ! ;
2024-08-26 11:01:08 -05:00
public int? Primera { get ; set ; }
public string? User { get ; set ; }
public int? Ldap { get ; set ; }
}
2024-09-23 08:54:57 -05:00
public class RecuperarClaveModel
{
public RecuperarClaveModel ( string _message , bool _exist = false , int? _estado = null , string? _correo = "" , string? _claveRec = "" )
{
Message = _message ;
Existe = _exist ;
Estado = _estado ;
Correo = _correo ;
ClaveRec = _claveRec ;
}
public bool Existe { get ; set ; }
public int? Estado { get ; set ; }
public string Message { get ; set ; } = null ! ;
public string Correo { get ; set ; }
public string ClaveRec { get ; set ; }
}
2024-08-26 11:01:08 -05:00
public class CambiarClaveModel
{
public string User { get ; set ; }
public string NewPassword { get ; set ; }
public string ConfirmPassword { get ; set ; }
2023-02-02 10:50:02 -05:00
}
static class Options
{
}
}