如何获取JSON格式的令牌

时间:2019-08-27 07:22:24

标签: c# asp.net-core asp.net-web-api swagger

enter image description here

我正在获取令牌,但是它不是json格式。我正在使用一个插件以json格式放置所有响应。而且除了gettoken API之外,所有其他API都运行良好

[HttpPost("gettoken")]
public IActionResult GetToken([FromBody]TokenRequest Input)
{


        var oUser=_userRepository.AuthenticateUser(Input.UserName,Input.Password);
        if (oUser!=null)
        {

            var claimsdata = new[] {
                new Claim(ClaimTypes.Name, oUser.UserName),
                new Claim(ClaimTypes.Role, oUser.Role)

            };
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SigningKey"]));
            int expiryInMinutes = Convert.ToInt32(_configuration["Jwt:ExpiryInMinutes"]);
            var signInCred = new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature);

            var token = new JwtSecurityToken(
                                                issuer: _configuration["Jwt:Issuer"],
                                                audience: _configuration["Jwt:Audience"],
                                                expires: DateTime.UtcNow.AddMinutes(expiryInMinutes),
                                                claims: claimsdata,
                                                signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
                                            );
            var tokenString = new JwtSecurityTokenHandler().WriteToken(token);
            return Ok(tokenString);
        }   

         return BadRequest("wrong request");

    // return View();
}

3 个答案:

答案 0 :(得分:2)

尝试使用setBackgrounds()代替npm i moduleName@version --save

答案 1 :(得分:1)

首先,我建议定义一个模型,该模型将最好地描述您的安全令牌。 假设是这样:

class SecurityToken
{
    public string Token { get; set; }
    public long Expires { get; set; }
}

您将在其中将令牌字符串存储在令牌属性中。这是“到期”属性中的到期日期。当然,这些字段不是必须的。

然后,创建您的控制器。我更喜欢从.NET Core继承ControllerBase

[Route("api/v1/[controller]")]
public class SecurityController : ControllerBase
{
    [HttpPost]
    [Route("[action]")]
    public async Task<IActionResult> Authorize([FromBody] AuthData credentials)
    {
        try
        {
            var tokenString = await ObtainToken(credentials, out long expires);
            return Ok(new SecurityToken() {
                Token = tokenString,
                Expires = expires
            });
        }catch(Exception ex)
        {
            return StatusCode(400, "Fail");
        }
    }
}

让我描述一下。在路线api / v1 / security / authorize上传递一些“抽象”凭据数据,即用户名和密码,可以用来获取令牌。方法ObtainToken只是一个示例,不是真实的方法。我以为它是异步的,因此控制器的操作返回Task<T>。我将“ IActionResult”作为更通用的名称:我们被允许返回OK(object)或StatusCode,BadRequest等(ControllerBase方法)。

您还可以定义以下内容:

public SecurityToken  Authorize([FromBody] AuthData credentials)
    {
        var tokenString = ObtainToken(credentials, out long expires);

        return new SecurityToken
        {
            Token = tokenString,
            Expires = expires
        };
    }

它将成功!

问题是到JSON的序列化是在幕后完成的,您不需要自己做。

谈论您的代码,我想您可以从基本开始:

  1. 创建模型,结果将返回。注意: 如果您想要JSON对象,则返回值必须是一个对象 前端。
  2. 修改操作的return Ok(tokenString)以返回模型。

答案 2 :(得分:1)

您所拥有的已经是有效的JWT令牌。您需要在客户端(JavaScript)上对其进行解码(仅base64)。为了验证它,您需要一个库,该库将使用令牌来验证签名以确保其未被篡改。

JWT令牌由三部分组成,以“。”分隔。 (您已经在屏幕截图中看到了):标头,有效负载和签名。

有关更多信息,请参见https://jwt.io。它还包含一个库列表,这些库支持在客户端(JavaScript,C#和其他语言)对JWT令牌进行解码和改进。

当前示例为JavaScript / NodeJ的jsonwebtoken@panva/jose

P.S。即使是简单的"Some string"也是null一样有效的json。