Ciao sono confuso quando creo un token con Net Core, ho seguito una guida e non funziona quando eseguo in Postman la richiesta Post.
Vedi, ho il mio database con le migrazioni di ef core, e la mia classe User ha UserName e Password {get; set;}.
Quindi ho creato un AuthController che contiene questo:
public class AuthController : Controller
{
private readonly IConfiguration _configuration;
private readonly HacsysContext _context;
public AuthController(IConfiguration configuration, HacsysContext context) {
_configuration = configuration;
}
[AllowAnonymous]
[HttpPost]
[Route("token")]
public IActionResult Post([FromBody]Personal personal)
{
if (ModelState.IsValid)
{
var userId = GetUserIdFromCredentials(personal);
if (userId == -1)
{
return Unauthorized();
}
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, personal.CorreoE),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var token = new JwtSecurityToken
(
issuer: _configuration["Issuer"],
audience: _configuration["Audience"],
claims: claims,
expires: DateTime.UtcNow.AddDays(10),
notBefore: DateTime.UtcNow,
signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["SigningKey"])),
SecurityAlgorithms.HmacSha256)
);
return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
}
return BadRequest();
}
private int GetUserIdFromCredentials(Personal personal)
{
var userId = -1;
var email = personal.CorreoE;
var password = personal.Contrasena;
if (personal.CorreoE.Equals(email))
{
userId = 1;
}
return userId;
}
}
Fondamentalmente, quando mi confronto in GetUserIdFromCredentials se l'e-mail è uguale a peronal.CorreoE restituisce sempre True, anche se in Postman invio un POST con solo una lettera o email diversa o Email diversa che non è nel mio database.
Stai ricevendo userId 1 ogni volta perché stai impostando per la prima volta il valore dell'e-mail sul valore di personal.CorreoE
e poi confrontando se il valore email
- email
è uguale a personal.CorreoE
.. Ciò sarà sempre vero e quindi restituirà 1.
Ma quello che dovresti fare è creare una query sull'entità personale nel dbContext per trovare una persona con quell'email e restituire userId dell'entità trovata
private int GetUserIdFromCredentials(Personal personal)
{
var email = personal.CorreoE;
var password = personal.Contrasena;
//make a query on the db context
var dbPerson = _context.Personal.FirstOrDefault(p=> p.Email == email);
if(dbPerson == null)
return -1;
return dbPerson.Id;
}