【问题标题】:Converting JWT (json Web token) into key value pairs in WebAPi将 JWT(json Web 令牌)转换为 WebAPi 中的键值对
【发布时间】:2015-10-30 03:06:33
【问题描述】:

我可以通过访问它的 Autorization Header 来访问我的 web api 操作中的 jwt

string jwt=Request.Headers.Authorization.ToString();
string jwtArray = jwt.split('.'); 

//现在我想把它的payload转换成键值对。

有效负载在 jwtArray[1] 中。谁能建议如何将其转换为 KVP。我假设 JWT 从外观上看是 Base64 编码的。

【问题讨论】:

    标签: c#-4.0 dictionary oauth-2.0 asp.net-web-api2 jwt


    【解决方案1】:

    试试这个

    var parts = token.Split('.');
    string partToConvert = parts[1];
    partToConvert = partToConvert.Replace('-', '+');
    partToConvert = partToConvert.Replace('_', '/');
    switch (partToConvert.Length % 4)
    {
      case 0:
          break;
      case 2:
          partToConvert += "==";
          break;
      case 3:
          partToConvert += "=";
          break;
    }
    var partAsBytes = Convert.FromBase64String(partToConvert);
    var partAsUTF8String = Encoding.UTF8.GetString(partAsBytes, 0, partAsBytes.Count());
    // You would need Json .NET for the below
    var jwt = JObject.Parse(partAsUTF8String);
    var dictionary = JsonConvert.DeserializeObject<Dictionary<string, object>>(jwt.ToString());
    

    【讨论】:

      【解决方案2】:

      为了更简洁的方法,这里有一个基于几个出色答案的帮助类。

      public static class StringExtensions
      {
          /// <summary>
          /// Convert a normal string to base64
          /// </summary>
          /// <param name="text">Original String</param>
          /// <returns></returns>
          /// <remarks>
          /// Original Source: https://stackoverflow.com/a/60738564/8058709
          /// </remarks>
          public static string EncodeToBase64(this string text)
          {
              return Convert.ToBase64String(Encoding.UTF8.GetBytes(text))
                  .TrimEnd('=').Replace('+', '-')
                  .Replace('/', '_');
          }
      
          /// <summary>
          /// Convert a base64 string to a normal one
          /// </summary>
          /// <param name="payload">Base64 string</param>
          /// <returns>A normal string</returns>
          /// <remarks>
          /// Original Source: https://stackoverflow.com/a/60738564/8058709
          /// </remarks>
          public static string DecodeFromBase64(this string payload)
          {
              payload = payload.Replace('_', '/').Replace('-', '+');
              switch (payload.Length % 4)
              {
                  case 2:
                      payload += "==";
                      break;
                  case 3:
                      payload += "=";
                      break;
              }
              return Encoding.UTF8.GetString(Convert.FromBase64String(payload));
          }
      
          /// <summary>
          /// Decode a JWT payload to a dictionary
          /// </summary>
          /// <param name="jwt">JWT payload</param>
          /// <returns>
          /// A dictionary representation of the jwt string
          /// </returns>
          /// <remarks>
          /// Inspiration: https://stackoverflow.com/a/31878953/8058709
          /// </remarks>
          public static IDictionary<string, object> DecodeJwt(this string jwt)
          {
              string[] chunks = jwt.Split('.');
      
              string data = DecodeFromBase64(chunks.ElementAtOrDefault(1));
              return JsonConvert.DeserializeObject<Dictionary<string, object>>(data);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-01
        • 2014-10-12
        • 2019-10-17
        • 2013-06-28
        • 2017-05-09
        • 2012-11-20
        • 2019-07-13
        相关资源
        最近更新 更多