using Microsoft.AspNetCore.Authorization;
using RSecurityBackend.Models.Generic;
using System;
using System.Linq;
using System.Threading.Tasks;
using RSecurityBackend.Services;
namespace RSecurityBackend.Authorization
{
///
/// UserGroupPermissionHandler
///
public class UserGroupPermissionHandler : AuthorizationHandler
{
///
/// HandleRequirementAsync
///
///
///
///
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, UserGroupPermissionRequirement requirement)
{
if (!context.User.HasClaim(c => c.Type == "UserId") || !context.User.HasClaim(c => c.Type == "SessionId"))
{
context.Fail();
return;
}
//this is the default policy to make sure the use session has not yet been deleted by him/her from another client
//or by an addmin (Authorize with no policy should fail on deleted sessions)
if (requirement.SecurableItemShortName == "null"/* && requirement.OperationShortName == "null"*/)
{
RServiceResult sessionCheckResult = await _appUserService.SessionExists(new Guid(context.User.Claims.FirstOrDefault(c => c.Type == "UserId").Value), new Guid(context.User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value));
if (!string.IsNullOrEmpty(sessionCheckResult.ExceptionString) || !sessionCheckResult.Result)
{
context.Fail();
return;
}
context.Succeed(requirement);
return;
}
RServiceResult result = await _userPermissionChecker.Check
(
new Guid(context.User.Claims.FirstOrDefault(c => c.Type == "UserId").Value),
new Guid(context.User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value),
requirement.SecurableItemShortName,
requirement.OperationShortName
);
if(result.Result)
{
context.Succeed(requirement);
return;
}
context.Fail();
}
///
/// IUserPermissionChecker instance
///
private IUserPermissionChecker _userPermissionChecker;
///
/// IAppUserService instance
///
protected IAppUserService _appUserService;
///
/// constructor
///
///
///
public UserGroupPermissionHandler(IUserPermissionChecker userPermissionChecker, IAppUserService appUserService) : base()
{
_userPermissionChecker = userPermissionChecker;
_appUserService = appUserService;
}
}
}