Agregamos la dependencia:

En la clase Startup, en el método ConfigureServices:
//JWT
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options => {
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true, //Validar Emisor
ValidateAudience = true, //Validar Audiencia
ValidateLifetime = true, //Validar tiempo
ValidateIssuerSigningKey = true, //Validar la firma del emisor
ValidIssuer = Configuration["Authentication:Issuer"], //Accdemos a valores que tenems en el appsetting.json
ValidAudience = Configuration["Authentication:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Authentication:Secretkey"])) //Secret Key
};
});
en el método configure:
app.UseAuthentication(); //JWT
app.UseAuthorization();
Obteniendo info de la base de datos:
public async Task<EmpleadoModel> GetUserCredentials(UserLogin login)
{
var sql = from empleado in _context.Empleados
join roles in _context.Roles on empleado.Rol equals roles.Id
select new EmpleadoModel
{
Id = empleado.Id,
Documento = empleado.Documento,
Nombres = empleado.Nombres,
Apellidos = empleado.Apellidos,
Roles = new RolModel
{
Descripcion = roles.Descripcion,
}
};
var response = await sql.FirstOrDefaultAsync(x =>
x.Documento == login.User);
return response;
}
public class TokenController : ControllerBase
{
private readonly IConfiguration _configuration;
private readonly ISecurityService _securityService;
public TokenController(IConfiguration configuration, ISecurityService securityService)
{
_configuration = configuration;
_securityService = securityService;
}
[HttpPost]
public async Task<IActionResult> Authentication(UserLogin userLogin)
{
var validation = await isValidaUser(userLogin);
if (validation.Item1)
{
var token = GenerateToken(validation.Item2);
return Ok(new { token });
}
return BadRequest();
}
private async Task<(bool, EmpleadoModel)> isValidaUser(UserLogin userLogin)
{
var response = await _securityService.GetUserCredentials(userLogin);
return (response != null, response);
}
private string GenerateToken(EmpleadoModel security)
{
var symmetricSecurityKry = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Authentication:Secretkey"]));
var signingCredentials = new SigningCredentials(symmetricSecurityKry, SecurityAlgorithms.HmacSha256);
var header = new JwtHeader(signingCredentials);
var claims = new[]
{
new Claim(ClaimTypes.Name, $"{security.Nombres} {security.Apellidos}"),
new Claim("Email", ""),
new Claim(ClaimTypes.Role, security.Roles.Descripcion),
};
var payload = new JwtPayload
(
_configuration["Authentication:Issuer"],
_configuration["Authentication:Audience"],
claims,
DateTime.Now,
DateTime.UtcNow.AddMinutes(10)
);
var token = new JwtSecurityToken(header, payload);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}