using System.Security.Claims; namespace Socialize.Api.Infrastructure.Security; public static class ClaimsPrincipalExtensions { public static IReadOnlyCollection GetScopeIds(this ClaimsPrincipal claims, string key) { return claims.FindAll(key) .Select(claim => Guid.TryParse(claim.Value, out Guid value) ? value : Guid.Empty) .Where(value => value != Guid.Empty) .Distinct() .ToArray(); } public static IReadOnlyCollection GetWorkspaceScopeIds(this ClaimsPrincipal claims) { return claims.GetScopeIds(KnownClaims.WorkspaceScope); } public static IReadOnlyCollection GetClientScopeIds(this ClaimsPrincipal claims) { return claims.GetScopeIds(KnownClaims.ClientScope); } public static IReadOnlyCollection GetProjectScopeIds(this ClaimsPrincipal claims) { return claims.GetScopeIds(KnownClaims.ProjectScope); } public static string? GetPersona(this ClaimsPrincipal claims) { return (string?)claims.GetClaim(KnownClaims.Persona); } public static Guid GetUserId(this ClaimsPrincipal claims) { return (Guid)claims.GetRequiredClaim(ClaimTypes.NameIdentifier); } public static string GetName(this ClaimsPrincipal claims) { return (string)claims.GetRequiredClaim(ClaimTypes.Name); } public static string? GetAlias(this ClaimsPrincipal claims) { return (string?)claims.GetClaim(KnownClaims.Alias); } public static string? GetPortraitUrl(this ClaimsPrincipal claims) { return (string?)claims.GetClaim(KnownClaims.PortraitUrl); } public static string GetFirstName(this ClaimsPrincipal claims) { return (string)claims.GetRequiredClaim(ClaimTypes.GivenName); } public static string GetLastName(this ClaimsPrincipal claims) { return (string)claims.GetRequiredClaim(ClaimTypes.Surname); } public static string GetEmail(this ClaimsPrincipal claims) { return (string)claims.GetRequiredClaim(ClaimTypes.Email); } private static object? GetClaim(this ClaimsPrincipal claims, string key) { Claim? claim = claims.FindFirst(key); return claim is null ? null : claims.GetRequiredClaim(key); } private static object GetRequiredClaim(this ClaimsPrincipal claims, string key) { Claim? claim = claims.FindFirst(key); if (claim is null) { throw new MissingClaimException(key); } return typeof(TValue) == typeof(Guid) ? Guid.Parse(claim.Value) : Convert.ChangeType(claim.Value, typeof(TValue)); } }