Files
2026-03-24 09:49:29 -05:00

45 lines
1.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using LCU.Library.Internal.Security.Models.AccessPolicy;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Configuration;
namespace LCU.Library.Internal.Security;
public static class AccessPolicyFactory
{
public static IEnumerable<(string Name, Action<AuthorizationPolicyBuilder> factory)> HandlePoliciesFromConfiguration(AccessPolicy policyConfiguration, string? parentName = null)
{
(string Name, Action<AuthorizationPolicyBuilder>) policy = (
$"{(parentName is not null ? $"{parentName}." : string.Empty)}{policyConfiguration.Name}",
b => b
.RequireAuthenticatedUser()
.AddRequirements(new GroupMembershipRequirement(policyConfiguration.Groups))
);
var childPolicies = policyConfiguration.Policies?.SelectMany(p => HandlePoliciesFromConfiguration(p, policy.Name)) ??
Enumerable.Empty<(string Name, Action<AuthorizationPolicyBuilder> factory)>();
return new[] { policy }.Concat(childPolicies);
}
public static AccessPolicies BuildPoliciesFromConfiguration(IConfigurationSection configuration)
{
var policies = configuration
.GetSection("AccessPolicies")
.GetChildren()
.Select(PolicyFactory);
return new AccessPolicies(policies.ToArray());
}
private static AccessPolicy PolicyFactory(IConfigurationSection configuration)
{
return new AccessPolicy
(
configuration.Key,
configuration.GetValue<string>(nameof(AccessPolicy.Groups))?.Split(",").Select(g => g.Trim()).ToArray(),
configuration.GetChildren().Where(c => c[nameof(AccessPolicy.Groups)] is not null).Select(PolicyFactory).ToArray()
);
}
}