using System.Collections.Generic;
public static void Main()
var encodedPayload = "jqNzdWKR2SQ4MTYxOGZlMC1lMTUxLTRmNGYtODAwYS1jYjMyYmM5ODhhZjSkbmFtZZGtTlJJQ1M2MDA1MDU0RqZpZFR5cGWRpE5SSUOoaWROdW1iZXKRqVM2MDA1MDU0RqVlbWFpbJG3aGFydG9ub19zdW5hbnRvQHRzcC5kZXajanRpkdkkNDVkMTdiMTYtMjBkZi00M2E0LWFlMjEtOGQxNTk4YTFhZWUxp2FwcENvZGWRoKVyb2xlc5PZIFVudmVyaWZpZWRFbWFpbFVzZXI7SW50ZXJuZXRVc2Vys1VudmVyaWZpZWRFbWFpbFVzZXKsSW50ZXJuZXRVc2Vyo25iZpGqMTczNDYwMzA3NqNleHCRqjE3MzQ2MDQ4NzajaWF0kaoxNzM0NjAzMDc2o2lzc5GoY2VnLmF1dGijYXVkkahjZWcuYXBwc6twZXJtaXNzaW9uc9wAFrtHZXRBY3RpdmVUZXJtc0FuZENvbmRpdGlvbnO8UG9zdFRlcm1pbmF0ZUVkZGFBcHBsaWNhdGlvbrlQb3N0Q3JlYXRlRWRkYUFwcGxpY2F0aW9uuUdldEVkZGFBcHBsaWNhdGlvbkRldGFpbHOsR2V0RWRkYUJhbmtzr0dldEVkZGFTZXR0aW5nc6tEZWxldGVEcmFmdLdQb3N0QXBpQ3JlYXRpb25DYWxsYmFja7pHZXRFZGRhQXBwbGljYXRpb25Mb2dzQnlJZL1Qb3N0QXBpQ3JlYXRpb25SZXN1bHRDYWxsYmFja7lQb3N0VXBkYXRlRWRkYUFwcGxpY2F0aW9u2SVHZXRBcGlDYW5jZWxsYXRpb25BdXRob3JpemF0aW9uU3RhdHVzuUdldEFwaUF1dGhvcml6YXRpb25TdGF0dXOzR2V0RWRkYVNldHRpbmdCeUtledkhUG9zdEFwaUNhbmNlbGxhdGlvblJlc3VsdENhbGxiYWNruVBvc3RTdWJtaXRFZGRhQXBwbGljYXRpb265R2V0RWRkYUFwcGxpY2F0aW9uTG9nTGlzdLtHZXRBY3RpdmVUZXJtc0FuZENvbmRpdGlvbnO-R2V0SW50ZXJuZXRFZGRhQXBwbGljYXRpb25MaXN0rkdldEVkZGFQcm9maWxluEdldEdvdmVybm1lbnRBZ2VuY3lCeVVlbrdHZXRHb3Zlcm5tZW50QWdlbmN5TGlzdA";
var payloadBytes = UrlSafeDecode(encodedPayload);
Console.WriteLine($"payloadBytes: {payloadBytes}");
var claims = MessagePackSerializer.Deserialize<Dictionary<string, IEnumerable<string>>>(payloadBytes);
foreach (var claim in claims)
Console.WriteLine($"Key: {claim.Key}");
Console.WriteLine("Values:");
foreach (var value in claim.Value)
Console.WriteLine($" - {value}");
Console.WriteLine($"Error: {ex.Message}");
public static byte[] UrlSafeDecode(string base64Url)
string base64 = base64Url.Replace('-', '+').Replace('_', '/');
switch (base64.Length % 4)
return Convert.FromBase64String(base64);