using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Options; public class PermissionPolicyProvider : IAuthorizationPolicyProvider { private readonly DefaultAuthorizationPolicyProvider _fallback; public PermissionPolicyProvider(IOptions options) { _fallback = new DefaultAuthorizationPolicyProvider(options); } public Task GetPolicyAsync(string policyName) { if (policyName.StartsWith("perm:", StringComparison.Ordinal)) { var permission = policyName["perm:".Length..]; var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .AddRequirements(new PermissionRequirement(permission)) .Build(); return Task.FromResult(policy); } return _fallback.GetPolicyAsync(policyName); } public Task GetDefaultPolicyAsync() => _fallback.GetDefaultPolicyAsync(); public Task GetFallbackPolicyAsync() => _fallback.GetFallbackPolicyAsync(); }