Some checks failed
Build Test Deploy / build-test (push) Has been cancelled
Build Test Deploy / authority-container (push) Has been cancelled
Build Test Deploy / docs (push) Has been cancelled
Build Test Deploy / deploy (push) Has been cancelled
Docs CI / lint-and-preview (push) Has been cancelled
68 lines
3.0 KiB
C#
68 lines
3.0 KiB
C#
using Microsoft.AspNetCore.Identity;
|
|
using OpenIddict.Abstractions;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Security.Claims;
|
|
using static OpenIddict.Abstractions.OpenIddictConstants;
|
|
|
|
namespace Ablera.Serdica.Authentication.Extensions
|
|
{
|
|
public static class ClaimExtensions
|
|
{
|
|
public static IReadOnlyCollection<Claim> BuildClaims<TKeyType>(
|
|
this IdentityUser<TKeyType> identity,
|
|
string? userName = null, string? givenName = null, string? surname = null)
|
|
where TKeyType : IEquatable<TKeyType> => new[]
|
|
{
|
|
new Claim(ClaimTypes.NameIdentifier, identity.Id?.ToString() ?? string.Empty),
|
|
new Claim(Claims.Subject, identity.Id?.ToString() ?? string.Empty),
|
|
new Claim(ClaimTypes.Name, userName ?? identity.UserName ?? string.Empty),
|
|
new Claim(ClaimTypes.GivenName, givenName ?? string.Empty),
|
|
new Claim(ClaimTypes.Surname, surname ?? string.Empty),
|
|
new Claim(ClaimTypes.Email, identity.Email ?? string.Empty)
|
|
};
|
|
|
|
public static IEnumerable<string> DestinationsSelector(this Claim c) => c.Type switch
|
|
{
|
|
Claims.Name or Claims.PreferredUsername
|
|
=> new[] { Destinations.AccessToken, Destinations.IdentityToken },
|
|
|
|
Claims.Email when c.Subject?.HasScope(Scopes.Email) == true
|
|
=> new[] { Destinations.AccessToken, Destinations.IdentityToken },
|
|
|
|
Claims.Role when c.Subject?.HasScope(Scopes.Roles) == true
|
|
=> new[] { Destinations.AccessToken, Destinations.IdentityToken },
|
|
|
|
_ => new[] { Destinations.AccessToken }
|
|
};
|
|
|
|
public static string? GetUserId(this ClaimsPrincipal user)
|
|
=> user.Claims.GetUserId() ?? Guid.Empty.ToString();
|
|
|
|
public static string? GetUserEmail(this ClaimsPrincipal user)
|
|
=> user.Claims
|
|
.FirstOrDefault(x => x.Type == ClaimTypes.Email)
|
|
?.Value?.ToString();
|
|
|
|
private static string? GetUserId(this IEnumerable<Claim> claims)
|
|
=> claims
|
|
.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)
|
|
?.Value?.ToString()
|
|
?? claims
|
|
.FirstOrDefault(x => x.Type == ClaimTypes.Name)
|
|
?.Value?.ToString();
|
|
|
|
public static string? GetClientApplicationId(this ClaimsPrincipal user)
|
|
=> user.Claims.GetClientApplicationId();
|
|
|
|
private static string? GetClientApplicationId(this IEnumerable<Claim> claims)
|
|
=> claims
|
|
.FirstOrDefault(x => x.Type == Claims.Subject)
|
|
?.Value?.ToString()
|
|
?? claims
|
|
.FirstOrDefault(x => x.Type == Claims.ClientId)
|
|
?.Value?.ToString();
|
|
}
|
|
}
|