using System.Security.Claims; using Bit.Core.Exceptions; using Microsoft.AspNetCore.Authorization; namespace Bit.Core.Utilities; public static class AuthorizationServiceExtensions { /// /// Checks if a user meets a specific requirement. /// /// The providing authorization. /// The user to evaluate the policy against. /// The requirement to evaluate the policy against. /// /// A flag indicating whether requirement evaluation has succeeded or failed. /// This value is true when the user fulfills the policy, otherwise false. /// public static Task AuthorizeAsync(this IAuthorizationService service, ClaimsPrincipal user, IAuthorizationRequirement requirement) { if (service == null) { throw new ArgumentNullException(nameof(service)); } if (requirement == null) { throw new ArgumentNullException(nameof(requirement)); } return service.AuthorizeAsync(user, resource: null, new[] { requirement }); } /// /// Performs an authorization check and throws a if the /// check fails or the resource is null. /// public static async Task AuthorizeOrThrowAsync(this IAuthorizationService service, ClaimsPrincipal user, object resource, IAuthorizationRequirement requirement) { ArgumentNullException.ThrowIfNull(service); ArgumentNullException.ThrowIfNull(requirement); if (resource == null) { throw new NotFoundException(); } var authorizationResult = await service.AuthorizeAsync(user, resource, requirement); if (!authorizationResult.Succeeded) { throw new NotFoundException(); } } }