Как создать пользовательские роли в .Net Core Web Api? - PullRequest
0 голосов
/ 01 мая 2018

У меня есть база данных с пользователями и ролями, у меня есть класс для проверки пользователя при входе в систему и 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;


    }
}

Спасибо.

1 Ответ

0 голосов
/ 01 мая 2018

Я нашел ответ, на случай, если кому-то будет интересно, это мое решение:

Я только добавляю new Claim(ClaimTypes.Role, HttpContext.Session.GetString("rol")) в вар претензии. Конечно, я использую сеанс для передачи роли текущего пользователя.

Наконец, я добавляю [Authorize (Role = "NameOfRoleResult")]

NameOfRoleResult - имя, основанное на результате утверждений.

...