如何在.Net Core Web Api中创建自定义角色?

时间:2018-05-01 13:14:43

标签: c# asp.net-core roles

我有一个包含用户和角色的数据库,我有一个类用于在登录和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;


    }
}

谢谢。

1 个答案:

答案 0 :(得分:0)

我找到了答案,如果有人可能感兴趣,这是我的解决方案:

我只添加new Claim(ClaimTypes.Role, HttpContext.Session.GetString("rol")) 在var声明中。 当然我使用Session来传递当前用户的rol。

最后我添加[授权(角色=" NameOfRoleResult")]

NameOfRoleResult是声明结果中的名称。