DefaultAuthorizationHandler.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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 if the checked requirement is the default policy and allow access when authenticated
  57. if (requirement.Policy == String.Empty && context.User.Identity.IsAuthenticated)
  58. {
  59. context.Succeed(requirement);
  60. return Task.CompletedTask;
  61. }
  62. // Check admin state of user
  63. var isAdmin = context.User.Identity.Name == Options.Administrator;
  64. if (isAdmin)
  65. {
  66. context.Succeed(requirement);
  67. return Task.CompletedTask;
  68. }
  69. // Process the UserHasPolicy check from the current authorization service
  70. var isAuthorized = _authorizationService.UserHasPolicy(context.User.Identity, requirement.Policy);
  71. if (isAuthorized)
  72. context.Succeed(requirement);
  73. else
  74. context.Fail();
  75. return Task.CompletedTask;
  76. }
  77. #endregion
  78. }
  79. }