PermissionHandler.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. // Copyright (c) 2018 Jon P Smith, GitHub: JonPSmith, web: http://www.thereformedprogrammer.net/
  2. // Licensed under MIT license. See License.txt in the project root for license information.
  3. using System.Security.Claims;
  4. using Hotline.SeedData;
  5. using IdentityModel;
  6. using Microsoft.AspNetCore.Authorization;
  7. namespace Hotline.Permissions
  8. {
  9. //thanks to https://www.jerriepelser.com/blog/creating-dynamic-authorization-policies-aspnet-core/
  10. public class PermissionHandler : AuthorizationHandler<PermissionRequirement>
  11. {
  12. private readonly IPermissionManager _permissionManager;
  13. public PermissionHandler(IPermissionManager permissionManager)
  14. {
  15. _permissionManager = permissionManager;
  16. }
  17. protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)
  18. {
  19. //var permissionsClaim =
  20. // context.User.Claims.SingleOrDefault(c => c.Type == PermissionConstants.PackedPermissionClaimType);
  21. //// If user does not have the scope claim, get out of here
  22. //if (permissionsClaim == null)
  23. // return Task.CompletedTask;
  24. //if (permissionsClaim.Value.ThisPermissionIsAllowed(requirement.PermissionName))
  25. // context.Succeed(requirement);
  26. var scops = context.User.Claims.Where(d => d.Type == JwtClaimTypes.Scope).Select(d => d.Value).ToList();
  27. if (scops.Any(d => d == "hotline_api"))
  28. {
  29. var roles = context.User.Claims.Where(d => d.Type == ClaimTypes.Role).Select(d => d.Value).ToList();
  30. if (roles.Exists(d => d == RoleSeedData.AdminRole))
  31. {
  32. context.Succeed(requirement);
  33. }
  34. else
  35. {
  36. var permissions = _permissionManager.RolesToPermissions(roles);
  37. if (permissions.Any(d => requirement.PermissionName == d))
  38. context.Succeed(requirement);
  39. }
  40. }
  41. return Task.CompletedTask;
  42. }
  43. }
  44. }