У меня есть база данных с пользователями и ролями, у меня есть класс для проверки пользователя при входе в систему и JWT.
Все в порядке, и теперь я хотел бы знать, как создавать собственные роли на основе моей базы данных, чтобы назначать их в моих контроллерах в [Authorize]
.
У меня есть этот sendnce в моем методе входа в систему, чтобы знать роль пользователя, и он работает нормально, возвращает роль, основанную на имени пользователя (у меня только 2 роли), но я не знаю, где его использовать, или как это реализовать:
var rol = _context.Personal.Include(x => x.RolPersonal).Where(x => x.CorreoE == personal.CorreoE).Select(x => x.RolPersonal.Descripcion).FirstOrDefault();
А это мой логин:
public class AuthController : Controller
{
private readonly IConfiguration _configuration;
private readonly HacContext _context;
public AuthController(IConfiguration configuration, HacContext context) {
_configuration = configuration;
_context = context;
}
[AllowAnonymous]
[HttpPost]
[Route("token")]
public IActionResult Post([FromBody]Personal personal)
{
if (ModelState.IsValid)
{
var userId = GetUserIdFromCredentials(personal);
if (!userId.HasValue)
{
return Unauthorized();
}
var claims = new[]
{
//new Claim(JwtRegisteredClaimNames.Sub, personal.RolPersonal.Descripcion),
new Claim(JwtRegisteredClaimNames.Email, personal.CorreoE),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
};
var token = new JwtSecurityToken
(
issuer: _configuration["Issuer"],
audience: _configuration["Audience"],
claims: claims,
expires: DateTime.UtcNow.AddHours(5),
notBefore: DateTime.UtcNow,
signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["SigningKey"])),
SecurityAlgorithms.HmacSha256)
);
var token_email = token.Claims.Where(w => w.Type == "email").Select(s => s.Value).FirstOrDefault();
HttpContext.Session.SetString("token_email", token_email);
return Ok(new{ email = personal.CorreoE, token = new JwtSecurityTokenHandler().WriteToken(token) });
}
return BadRequest();
}
private int? GetUserIdFromCredentials(Personal personal)
{
var email = _context.Personal.Where(x => x.CorreoE == personal.CorreoE).Select(x => x.CorreoE).FirstOrDefault();
var pass = _context.Personal.Where(x => x.Contrasena == personal.Contrasena).Select(x => x.Contrasena).FirstOrDefault();
var rol = _context.Personal.Include(x => x.RolPersonal).Where(x => x.CorreoE == personal.CorreoE).Select(x => x.RolPersonal.Descripcion).FirstOrDefault();
if (string.IsNullOrEmpty(email))
{
return null;
}
if (personal.CorreoE.Equals(email) && personal.Contrasena.Equals(pass))
{
return 1;
}
return null;
}
}
Спасибо.