我有一个包含用户和角色的数据库,我有一个类用于在登录和JWT中验证用户。
直到这里,现在我想知道如何在我的数据库中创建自定义角色,以便在我[Authorize]
的控制器中分配它们。
我通过登录方式知道用户的角色,并且工作正常,返回基于用户登录的角色(我只有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;
}
}
谢谢。
答案 0 :(得分:0)
我找到了答案,如果有人可能感兴趣,这是我的解决方案:
我只添加new Claim(ClaimTypes.Role, HttpContext.Session.GetString("rol"))
在var声明中。
当然我使用Session来传递当前用户的rol。
最后我添加[授权(角色=" NameOfRoleResult")]
NameOfRoleResult是声明结果中的名称。