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

Posted

技术标签:

【中文标题】如何在 Asp.NET Core WEB API 中使用 .Net (C#) 在 Payload 中创建具有自定义 JSON 声明的 JWT 令牌【英文标题】:How to create a JWT token with custom JSON claims in Payload using .Net (C#) in Asp.NET Core WEB API 【发布时间】: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"
                                      
  
    

【问题讨论】:

【参考方案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();

【讨论】:

以上是关于如何在 Asp.NET Core WEB API 中使用 .Net (C#) 在 Payload 中创建具有自定义 JSON 声明的 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.net Core Web Api 中默认使用 Newtonsoft.Json?

如何在 ASP.NET Core Web API 中使用 MassTransit 事件总线?

如何在 asp.net core web api 中绑定 Json Query 字符串

ASP.NET Core Web API - 如何在中间件管道中隐藏 DbContext 事务?

Asp.Net Core Web API 应用程序:如何更改监听地址?

如何在 ASP.NET Core Web API 中添加两个不同的令牌