JwtPaser.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Security.Claims;
  5. using System.Text.Json;
  6. using System.Threading.Tasks;
  7. namespace wispro.sp.web.Utils
  8. {
  9. public class JwtParser
  10. {
  11. public static IEnumerable<Claim> ParseClaimsFromJwt(string jwt)
  12. {
  13. var claims = new List<Claim>();
  14. var payload = jwt.Split('.')[1];
  15. var jsonBytes = ParseBase64WithoutPadding(payload);
  16. var keyValuePairs = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonBytes);
  17. keyValuePairs.TryGetValue(ClaimTypes.Role, out object roles);
  18. if (roles != null)
  19. {
  20. if (roles.ToString().Trim().StartsWith(","))
  21. {
  22. var parsedRoles = JsonSerializer.Deserialize<string[]>(roles.ToString());
  23. foreach (var parsedRole in parsedRoles)
  24. {
  25. claims.Add(new Claim(ClaimTypes.Role, parsedRole));
  26. }
  27. }
  28. else
  29. {
  30. claims.Add(new Claim(ClaimTypes.Role, roles.ToString()));
  31. }
  32. keyValuePairs.Remove(ClaimTypes.Role);
  33. }
  34. claims.AddRange(keyValuePairs.Select(kvp => new Claim(kvp.Key, kvp.Value.ToString())));
  35. return claims;
  36. }
  37. private static byte[] ParseBase64WithoutPadding(string base64)
  38. {
  39. base64 = base64.Replace('-', '+').Replace('_', '/');
  40. switch (base64.Length % 4)
  41. {
  42. case 2: base64 += "=="; break;
  43. case 3: base64 += "="; break;
  44. }
  45. //Console.WriteLine(base64);
  46. return Convert.FromBase64String(base64);
  47. }
  48. }
  49. }