如何在 Asp.NET Core WEB API 中使用 .Net (C#) 在 Payload 中创建带有自定义 JSON 声明的 JWT 令牌

Jim*_*obo 6 c# jwt asp.net-core asp.net-core-webapi

我正在使用以下代码生成令牌,其中包含简单的 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();

    }
}
}
Run Code Online (Sandbox Code Playgroud)

JWT 有效载荷数据:

     {
      "id": "1234",
     "exp": 1538637844,
      "iss": "mysite.com"
      }
Run Code Online (Sandbox Code Playgroud)

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

  {
   "id": "1234",
   "exp": 1538637844,
   "iss": "mysite.com"
   "user": {
          "id" :"user1"
           }                           
  }
    
Run Code Online (Sandbox Code Playgroud)

Jim*_*obo 8

这是代码

[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();
}
Run Code Online (Sandbox Code Playgroud)

和最终的有效载荷 PAYLOAD: DATA

{
  "subject": "custom claims",
  "exp": 1538651961,
  "iss": "mysite.com",
  "user": {
    "id": "1234"
  }
}
Run Code Online (Sandbox Code Playgroud)


And*_*rei 8

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

Install-Package JWT 
Run Code Online (Sandbox Code Playgroud)

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

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