42 lines
1.3 KiB
C#
42 lines
1.3 KiB
C#
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<AuthorizationOptions> options)
|
|
{
|
|
FallbackProvider = new DefaultAuthorizationPolicyProvider(options);
|
|
}
|
|
|
|
public async Task<AuthorizationPolicy?> 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<AuthorizationPolicy> GetDefaultPolicyAsync()
|
|
=> FallbackProvider.GetDefaultPolicyAsync();
|
|
|
|
public Task<AuthorizationPolicy?> GetFallbackPolicyAsync()
|
|
=> FallbackProvider.GetFallbackPolicyAsync();
|
|
}
|
|
|
|
public class PermissionRequirement : IAuthorizationRequirement
|
|
{
|
|
public string Identifier { get; }
|
|
|
|
public PermissionRequirement(string identifier)
|
|
{
|
|
Identifier = identifier;
|
|
}
|
|
} |