【问题标题】: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);
}
}