添加具有可变参数的 .Net Core 策略

Adding .Net Core Policy with variable Parameters on Requirements

我正在尝试实施一项非常精细的政策。 这个想法就像图像中一样。

每个实体与右边的实体总是一对多关系。 一个机构可以有很多课程,每个课程可以有很多学科, 每个 Subject 可以有很多 Syllabus, 等等...

有 3 个角色:AdministratorContributorViewer

如果您在顶级实体之一中拥有角色,则该角色将传播到下面的其余实体。 例如:如果您是课程管理员,您就是学科、教学大纲等的管理员...

如果您是其中一个教学大纲的贡献者,您将成为本教学大纲的以下课程和视频的贡献者。

我尝试使用 Custom Policies:

来解决

添加如下要求:

public class AdministratorRequirement : IAuthorizationRequirement
    {
        public int UserId { get; private set; }
        public EntityType EntityType { get; private set; }
        public int EntityId { get; private set; }

        public AdministratorRequirement(int userId, EntityType entityType, int entityId)
        {
            UserId = userId;
            EntityType = entityType;
            EntityId = entityId;
        }
    }

并如下添加策略处理程序:

public class AdministratorHandler : AuthorizationHandler<AdministratorRequirement>
    {
        public IRolesRepository RolesRepository {get;set;}

        public AdministratorHandler(IRolesRepository rolesRepository)
        {
            RolesRepository = rolesRepository;
        }

        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AdministratorRequirement requirement)
        {
            // Save User object to access claims
            bool isAdministrator = RolesRepository.CheckUserRole(requirement.UserId, requirement.EntityType, requirement.EntityId, "Administrator");

            if (isAdministrator)
                context.Succeed(requirement);

            return Task.CompletedTask;

        }
    }

问题是我想在启动时定义变量要求 class:

  options.AddPolicy("CourseAdministrator",
                                    policy => policy
                                            .Requirements
                                            .Add(
                                                    new AdministratorRequirement(
                                                    /*userId - should be variable*/ 0,
                                                    EntityType.Course,
                                                    /*int entityId - should be variable*/ 0))

然后用在类似

的东西上
    [Authorize(/*pass some parameters in here like user Id and course Id*/)]
    [HttpPost]
    [Route("create")]
    public async Task<IActionResult> CreateCourse([FromBody] Course course)
    {
        //Or call the policy handler programatically in here.
        CleanCacheOnUpdateCourse();
        return Ok(await Services.CreateCourse(course, EmauaUser));
    }

不知道有没有这样的解决方案?

对于策略,您需要传递静态变量。

如果您想动态检查权限,您可以实现自己的IAuthorizationFilter,例如

  1. 自定义IAuthorizationFilter

    public class CustomAuthorize : IAuthorizationFilter         
    {
            private readonly int _input;
    
            public CustomAuthorize(int input)
            {
                _input = input;
            }
    
            public void OnAuthorization(AuthorizationFilterContext context)
            {
                //custom validation rule
                if (_input == 1)
                {
                    context.Result = new ForbidResult();
                }
            }
    }
    
    1. 自定义CustomAuthorizeAttribute

              public class CustomAuthorizeAttribute : TypeFilterAttribute
              {
                    public CustomAuthorizeAttribute(int input) : base(typeof(CustomAuthorize))
                    {
                        Arguments = new object[] { input };
                    }
              }
      
    2. 使用

           [CustomAuthorizeAttribute(1)]
          public IActionResult About()