using System.Linq;
using System.Threading.Tasks;
using gehGassi.Core.Interfaces;
using gehGassi.Permissions;
using gehGassi.Web.Auth.Requirements;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
namespace gehGassi.Web.Auth.AuthorizationHandlers
{
///
/// Handler für Permission Policies
///
public class PermissionHandler : AuthorizationHandler
{
IHttpContextAccessor _httpContextAccessor = null;
private readonly IUserService _userService;
public PermissionHandler(IHttpContextAccessor httpContextAccessor, IUserService userService)
{
_httpContextAccessor = httpContextAccessor;
_userService = userService;
}
///
/// Makes a decision if authorization is allowed based on a specific requirement.
///
/// The authorization context.
/// The requirement to evaluate.
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)
{
var permissionsClaim = context.User.Claims.SingleOrDefault(c => c.Type == ClaimConstants.PackedPermissionClaimType);
if (permissionsClaim != null)
{
if (permissionsClaim.Value.ThisPermissionIsAllowed(requirement.PermissionName))
{
context.Succeed(requirement);
}
return;
}
//Wenn der Claim nicht vorhanden war, dann in der DB prüfen
var user = await _userService.GetByUsernameAsync(context.User.Identity.Name);
if (user != null)
{
if (string.IsNullOrWhiteSpace(user.Permissions))
return;
if (user.Permissions.ThisPermissionIsAllowed(requirement.PermissionName))
context.Succeed(requirement);
}
}
}
}