Files
FjpSite/FJPSite/Handlers/PermissionAuthorizationHandler.cs

45 lines
1.4 KiB
C#

using FJPSite.Helpers;
using Microsoft.AspNetCore.Authorization;
using System.Security.Claims;
namespace FJPSite.Handlers;
public class PermissionAuthorizationHandler : AuthorizationHandler<PermissionRequirement>
{
private readonly IPermissionService _permissionService;
private readonly IHttpContextAccessor _httpContextAccessor;
public PermissionAuthorizationHandler(
IPermissionService permissionService,
IHttpContextAccessor httpContextAccessor)
{
_permissionService = permissionService;
_httpContextAccessor = httpContextAccessor;
}
protected override async Task HandleRequirementAsync(
AuthorizationHandlerContext context,
PermissionRequirement requirement)
{
if (context.User == null)
{
context.Fail();
return;
}
// Get user ID from claims
var userId = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
if (string.IsNullOrEmpty(userId))
{
context.Fail();
return;
}
// Check if user has the required permission
bool hasPermission = await _permissionService
.UserHasPermissionAsync(userId, requirement.Feature, requirement.Action);
if (hasPermission)
{
context.Succeed(requirement);
}
else
{
context.Fail();
}
}