92 lines
2.7 KiB
C#
92 lines
2.7 KiB
C#
using System.Security.Claims;
|
|
|
|
namespace Socialize.Infrastructure.Security;
|
|
|
|
public static class ClaimsPrincipalExtensions
|
|
{
|
|
public static IReadOnlyCollection<Guid> 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<Guid> GetWorkspaceScopeIds(this ClaimsPrincipal claims)
|
|
{
|
|
return claims.GetScopeIds(KnownClaims.WorkspaceScope);
|
|
}
|
|
|
|
public static IReadOnlyCollection<Guid> GetClientScopeIds(this ClaimsPrincipal claims)
|
|
{
|
|
return claims.GetScopeIds(KnownClaims.ClientScope);
|
|
}
|
|
|
|
public static IReadOnlyCollection<Guid> GetProjectScopeIds(this ClaimsPrincipal claims)
|
|
{
|
|
return claims.GetScopeIds(KnownClaims.ProjectScope);
|
|
}
|
|
|
|
public static string? GetPersona(this ClaimsPrincipal claims)
|
|
{
|
|
return (string?)claims.GetClaim<string?>(KnownClaims.Persona);
|
|
}
|
|
|
|
public static Guid GetUserId(this ClaimsPrincipal claims)
|
|
{
|
|
return (Guid)claims.GetRequiredClaim<Guid>(ClaimTypes.NameIdentifier);
|
|
}
|
|
|
|
public static string GetName(this ClaimsPrincipal claims)
|
|
{
|
|
return (string)claims.GetRequiredClaim<string>(ClaimTypes.Name);
|
|
}
|
|
|
|
public static string? GetAlias(this ClaimsPrincipal claims)
|
|
{
|
|
return (string?)claims.GetClaim<string?>(KnownClaims.Alias);
|
|
}
|
|
|
|
public static string? GetPortraitUrl(this ClaimsPrincipal claims)
|
|
{
|
|
return (string?)claims.GetClaim<string?>(KnownClaims.PortraitUrl);
|
|
}
|
|
|
|
public static string GetFirstName(this ClaimsPrincipal claims)
|
|
{
|
|
return (string)claims.GetRequiredClaim<string>(ClaimTypes.GivenName);
|
|
}
|
|
|
|
public static string GetLastName(this ClaimsPrincipal claims)
|
|
{
|
|
return (string)claims.GetRequiredClaim<string>(ClaimTypes.Surname);
|
|
}
|
|
|
|
public static string GetEmail(this ClaimsPrincipal claims)
|
|
{
|
|
return (string)claims.GetRequiredClaim<string>(ClaimTypes.Email);
|
|
}
|
|
|
|
private static object? GetClaim<TValue>(this ClaimsPrincipal claims, string key)
|
|
{
|
|
Claim? claim = claims.FindFirst(key);
|
|
|
|
return claim is null ? null : claims.GetRequiredClaim<TValue>(key);
|
|
}
|
|
|
|
private static object GetRequiredClaim<TValue>(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));
|
|
}
|
|
}
|