Apigateway/IntegradorBE/Controllers/AuthController.cs
2022-11-02 11:31:23 -05:00

97 lines
3.0 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using Security;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using System.Web;
namespace IntegradorBE.Controllers
{
[ApiController]
[Route("[controller]")]
public class AuthController : ControllerBase
{
private static readonly Encripter _encript = new();
[HttpPost("Login")]
public IActionResult Login()
{
try
{
var ip = "";
if (HttpContext?.Connection?.RemoteIpAddress != null)
ip = HttpContext.Connection.RemoteIpAddress.ToString();
if (String.IsNullOrWhiteSpace(ip))
ip = HttpContext?.Request.Headers["REMOTE_ADDR"];
if (!_encript.IsValid) return BadRequest("Lectura inválida");
if (String.IsNullOrWhiteSpace(ip)) return Unauthorized("Acceso no autorizado.");
//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("IP", ip),
new Claim("permisos", _encript.EncryptHashTkn("externo") + "::-1")
});
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 Ok(new {
token = Encripter.Cypher(token)
});
} catch (Exception e)
{
return BadRequest(e.Message);
}
}
[HttpGet("Encriptar")]
public IActionResult Encriptar(string text, int tipo)
{
if (!_encript.IsValid) return BadRequest("Lectura inválida");
if (tipo == 0) return Ok(_encript.EncryptPwd(text));
return Ok(_encript.EncryptHashTkn(text));
}
[HttpGet("Desencriptar")]
public IActionResult Desencriptar(string text, int tipo)
{
if (!_encript.IsValid) return BadRequest("Lectura inválida");
if (tipo == 0) return Ok(_encript.DecryptPwd(text));
return Ok(_encript.DecryptHashTkn(text));
}
}
public class LoginModel
{
public string? TX_CORREO_USUMS { get; set; }
public string? TX_PASSWORD_USUMS { get; set; }
}
}