gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:53:26 25 4
gpt4 key购买 nike

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

enter image description here

每个实体始终与右边的实体具有一对多关系。一个Institution可以有多个Course,每个Course可以有多个Subject,每个Subject> 可以有很多教学大纲等...

有 3 个角色:AdministratorContributorViewer

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

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

我尝试使用自定义策略来解决它:

添加如下要求:

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;

}
}

问题是我想在 Startup 类上定义变量要求:

  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));
}

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

最佳答案

对于 Policy,您需要传递 satic 变量。

如果您想动态检查权限,您可以实现自己的 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()

关于c# - 添加具有可变参数的 .Net Core 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58859199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com