1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Security.Claims;
- using System.Text.Json;
- using System.Threading.Tasks;
- namespace wispro.sp.web.Utils
- {
- public class JwtParser
- {
- public static IEnumerable<Claim> ParseClaimsFromJwt(string jwt)
- {
- var claims = new List<Claim>();
- var payload = jwt.Split('.')[1];
- var jsonBytes = ParseBase64WithoutPadding(payload);
- var keyValuePairs = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonBytes);
- keyValuePairs.TryGetValue(ClaimTypes.Role, out object roles);
- if (roles != null)
- {
- if (roles.ToString().Trim().StartsWith(","))
- {
- var parsedRoles = JsonSerializer.Deserialize<string[]>(roles.ToString());
- foreach (var parsedRole in parsedRoles)
- {
- claims.Add(new Claim(ClaimTypes.Role, parsedRole));
- }
- }
- else
- {
- claims.Add(new Claim(ClaimTypes.Role, roles.ToString()));
- }
- keyValuePairs.Remove(ClaimTypes.Role);
- }
- claims.AddRange(keyValuePairs.Select(kvp => new Claim(kvp.Key, kvp.Value.ToString())));
- return claims;
- }
- private static byte[] ParseBase64WithoutPadding(string base64)
- {
- base64 = base64.Replace('-', '+').Replace('_', '/');
- switch (base64.Length % 4)
- {
- case 2: base64 += "=="; break;
- case 3: base64 += "="; break;
- }
- Console.WriteLine(base64);
- return Convert.FromBase64String(base64);
- }
- }
- }
|