【问题标题】:How to create a JWT token with custom JSON claims in Payload using .Net (C#) in Asp.NET Core WEB API如何在 Asp.NET Core WEB API 中使用 .Net (C#) 在 Payload 中创建具有自定义 JSON 声明的 JWT 令牌
【发布时间】:2019-03-09 13:02:38
【问题描述】:

我正在使用下面的代码和简单的 JSON 数据生成令牌

  [HttpPost("Token")]
     public IActionResult Token(string userid)
    {
        if ((!string.IsNullOrEmpty(userid)))
        {
            var user = webuserprovider.GetWebUser(userid);

            // validate for 0 records 
            if (user.Count() > 0)
            {
               // if user return 1 row
               var claimsdata = new[]
               { 
                     new  Claim("id",user.First().UserID),                     
               };
                
                var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("secretKey"));
                var signInCred = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
                var token = new JwtSecurityToken(
                      users:{ "id": user.First().UserID},
                      issuer: "mysite.com",
                      audience: "yoursite.com",
                      expires: DateTime.Now.AddMinutes(3),
                      claims: claimsdata,                      
                    signingCredentials: signInCred
                    );
                  var jwt = new JwtSecurityTokenHandler().WriteToken(token);
                  return Ok(new {jwt});
               // return Ok( new JwtSecurityTokenHandler().WriteToken(token) );
            }
            else
            {// return BadRequest(new { message = "UserID does not exist" }); }
             // return BadRequest("Could not verify user");
                return NotFound();
            }
        }
        return Unauthorized();

    }
}
}

JWT 有效负载数据:

     {
      "id": "1234",
     "exp": 1538637844,
      "iss": "mysite.com"
      }

如何在 Asp.net Core Web API REST 中的 C# 中使用如下自定义声明创建有效负载数据?有效载荷数据中 { } 内的用户 ID -->

  {
   "id": "1234",
   "exp": 1538637844,
   "iss": "mysite.com"
   "user": {
          "id" :"user1"
           }                           
  }
    

【问题讨论】:

    标签: c# asp.net-core jwt asp.net-core-webapi


    【解决方案1】:

    这是代码

    [HttpPost("Token")]
    public IActionResult Token(string userid)
    {
        if ((!string.IsNullOrEmpty(userid)))
        {
            var user = webuserprovider.GetWebUser(userid);
    
            // validate for 0 records 
            if (user.Count() > 0)
            {
               // if user return 1 row
               var claimsdata = new[]
               { 
                     new  Claim("subject","custom claims"),                     
               };
    
                var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("secretKey"));
                var signInCred = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
                var token = new JwtSecurityToken(
                      users:{ "id": user.First().UserID},
                      issuer: "mysite.com",
                      audience: "yoursite.com",
                      expires: DateTime.Now.AddMinutes(3),
                      claims: claimsdata,                      
                    signingCredentials: signInCred
                    );
                   //custom claims as per  requirements
                    var jsonu = new { id = user.First().UserID };
                    token.Payload["user"] = jsonu;
                   //End of custom claims
                  var jwt = new JwtSecurityTokenHandler().WriteToken(token);
                  return Ok(new {jwt});
               // return Ok( new JwtSecurityTokenHandler().WriteToken(token) );
            }
            else
            {// return BadRequest(new { message = "UserID does not exist" }); }
             // return BadRequest("Could not verify user");
                return NotFound();
            }
        }
        return Unauthorized();
    }
    

    最后的Payload PAYLOAD:DATA

    {
      "subject": "custom claims",
      "exp": 1538651961,
      "iss": "mysite.com",
      "user": {
        "id": "1234"
      }
    }
    

    【讨论】:

      【解决方案2】:

      对于 JWT,我通常使用 JWT nuget 包,因为我不喜欢开箱即用的方式。

      Install-Package JWT 
      

      查看documentation。使用这个包非常简单。

      var token = new JwtBuilder()
        .WithAlgorithm(new HMACSHA256Algorithm())
        .WithSecret(secret)
        .AddClaim("exp", DateTimeOffset.UtcNow.AddHours(1).ToUnixTimeSeconds())
        .AddClaim("claim2", "claim2-value")
        .Build();
      

      【讨论】:

        猜你喜欢
        • 2018-07-01
        • 2019-08-03
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 2018-06-16
        • 2022-01-09
        • 2021-01-28
        • 1970-01-01
        相关资源
        最近更新 更多