using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Options; using Moonlight.Shared; namespace Moonlight.Api.Implementations; public class PermissionPolicyProvider : IAuthorizationPolicyProvider { private readonly DefaultAuthorizationPolicyProvider FallbackProvider; public PermissionPolicyProvider(IOptions options) { FallbackProvider = new DefaultAuthorizationPolicyProvider(options); } public async Task GetPolicyAsync(string policyName) { if (!policyName.StartsWith(Permissions.Prefix, StringComparison.OrdinalIgnoreCase)) return await FallbackProvider.GetPolicyAsync(policyName); var policy = new AuthorizationPolicyBuilder(); policy.AddRequirements(new PermissionRequirement(policyName)); return policy.Build(); } public Task GetDefaultPolicyAsync() => FallbackProvider.GetDefaultPolicyAsync(); public Task GetFallbackPolicyAsync() => FallbackProvider.GetFallbackPolicyAsync(); } public class PermissionRequirement : IAuthorizationRequirement { public string Identifier { get; } public PermissionRequirement(string identifier) { Identifier = identifier; } }