DefaultAuthorizationHandler.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Identity;
  4. using Microsoft.Extensions.Configuration;
  5. using Microsoft.Extensions.DependencyInjection;
  6. using Microsoft.Extensions.Options;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Security.Claims;
  11. using System.Security.Principal;
  12. using System.Threading.Tasks;
  13. namespace GreenTree.Strohrmann.ERP.Services.Authorization
  14. {
  15. public class DefaultAuthorizationHandler : AuthorizationHandler<DefaultAuthorizationPolicy>
  16. {
  17. #region DI fields
  18. // The current authorization service
  19. private readonly IAuthorizationService _authorizationService;
  20. private readonly IHttpContextAccessor _httpContextAccessor;
  21. #endregion
  22. #region Properties
  23. /// <summary>
  24. /// The administration Options
  25. /// </summary>
  26. public AdministrationOptions Options { get; set; }
  27. #endregion
  28. #region DI Ctor
  29. /// <summary>
  30. /// Initializes a new instance of the DefaultAuthorizationHandler class
  31. /// </summary>
  32. /// <param name="authorizationService">The dependent authorization serivce.</param>
  33. /// <param name="administrationOptions">The global administration options.</param>
  34. public DefaultAuthorizationHandler(
  35. IAuthorizationService authorizationService,
  36. IConfiguration configuration,
  37. IHttpContextAccessor httpContextAccessor)
  38. {
  39. _authorizationService = authorizationService;
  40. var administrationOptions = configuration.GetSection("AdministrationOptions").Get<AdministrationOptions>();
  41. if (administrationOptions == null)
  42. throw new Exception("The appsettings.json does not contain administration options.");
  43. Options = administrationOptions;
  44. _httpContextAccessor = httpContextAccessor;
  45. }
  46. #endregion
  47. #region Implementation AuthorizationHandler
  48. /// <summary>
  49. /// Handle the current requirement for a specific resource
  50. /// </summary>
  51. /// <param name="context">The authorization context.</param>
  52. /// <param name="requirement">The requirement.</param>
  53. /// <returns>Returns a succeeded or failed task if the user is authorized for the required resource.</returns>
  54. protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, DefaultAuthorizationPolicy requirement)
  55. {
  56. // Check admin state of user
  57. var isAdmin = context.User.Identity.Name == Options.Administrator;
  58. if (isAdmin)
  59. {
  60. context.Succeed(requirement);
  61. return Task.CompletedTask;
  62. }
  63. // Process the UserHasPolicy check from the current authorization service
  64. var isAuthorized = _authorizationService.UserHasPolicy(context.User.Identity, requirement.Policy);
  65. if (isAuthorized)
  66. context.Succeed(requirement);
  67. else
  68. context.Fail();
  69. return Task.CompletedTask;
  70. }
  71. #endregion
  72. }
  73. }