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();
}
}
}