如何在web api中使用令牌发送声明

时间:2018-04-18 14:42:20

标签: asp.net-web-api asp.net-core jwt

我在.NET Core中有一个带有令牌授权的WebApi。 我按照指南来实现它,但响应只显示令牌,没关系,但我希望看到其他声明。

这是我的代码:

public IActionResult Post([FromBody]Personal personal)
        {
            if (ModelState.IsValid)
            {
                var userId = GetUserIdFromCredentials(personal);
                if (!userId.HasValue)
                {
                    return Unauthorized();
                }
                var rolUsuario = _context.Personales.Include(p => p.RolPersonal).Select(x => x.RolPersonal.Descripcion).FirstOrDefault();

                var claims = new[]
                {
                    new Claim(JwtRegisteredClaimNames.Sub, rolUsuario),
                    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{ token = new JwtSecurityTokenHandler().WriteToken(token) });
            }

            return BadRequest();
        }

结果如下:

{ 
    "token": "eyJhbGciOiJ....oTT7KI6kcZy-o" 
} 

我希望看到电子邮件声明为例:

{ 
    "email": bla@bla.com,
    "token": "eyJhbGciOiJ....oTT7KI6kcZy-o" 
} 

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以简单地扩展您已经使用过的匿名对象:

return Ok(new { email = personal.CorreoE, token = new JwtSecurityTokenHandler().WriteToken(token)});

结果如下:

{"email":"email@exmaple.com","token":"eyJ....."}

除此之外,您当然还可以在客户端解码令牌并提取您在服务器端添加的所有声明。 检查https://jwt.io以查看令牌的内容。