http-api/src/Application/Common/Authorization/MustBeObjectOwnerOrAdminRequirement.cs
cuqmbr 0508c89c2d
All checks were successful
/ build (push) Successful in 7m55s
/ tests (push) Successful in 40s
/ build-docker (push) Successful in 8m27s
add authorization requirements
2025-06-03 18:00:07 +03:00

43 lines
1.3 KiB
C#

using MediatR.Behaviors.Authorization;
using cuqmbr.TravelGuide.Domain.Enums;
namespace cuqmbr.TravelGuide.Application.Common.Authorization;
public class MustBeObjectOwnerOrAdminRequirement : IAuthorizationRequirement
{
public ICollection<IdentityRole>? UserRoles { get; init; }
public Guid? UserGuid { get; init; }
public Guid? RequiredGuid { get; init; }
class MustBeObjectOwnerOrAdminRequirementHandler :
IAuthorizationHandler<MustBeObjectOwnerOrAdminRequirement>
{
public Task<AuthorizationResult> Handle(
MustBeObjectOwnerOrAdminRequirement request,
CancellationToken cancellationToken)
{
var isAdmin = request?.UserRoles
?.Any(ur => ur.Equals(IdentityRole.Administrator)) ??
false;
if (isAdmin)
{
return Task.FromResult(AuthorizationResult.Succeed());
}
if (request?.UserGuid == null || request?.RequiredGuid == null)
{
return Task.FromResult(AuthorizationResult.Fail());
}
if (request.UserGuid == request.RequiredGuid)
{
return Task.FromResult(AuthorizationResult.Succeed());
}
return Task.FromResult(AuthorizationResult.Fail());
}
}
}