45 lines
1.8 KiB
C#
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()
|
|
);
|
|
}
|
|
} |