添加具有可变参数的 .Net Core 策略
Adding .Net Core Policy with variable Parameters on Requirements
我正在尝试实施一项非常精细的政策。
这个想法就像图像中一样。
每个实体与右边的实体总是一对多关系。
一个机构可以有很多课程,每个课程可以有很多学科, 每个 Subject 可以有很多 Syllabus, 等等...
有 3 个角色:Administrator
、Contributor
、Viewer
如果您在顶级实体之一中拥有角色,则该角色将传播到下面的其余实体。
例如:如果您是课程管理员,您就是学科、教学大纲等的管理员...
如果您是其中一个教学大纲的贡献者,您将成为本教学大纲的以下课程和视频的贡献者。
我尝试使用 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
,例如
自定义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();
}
}
}
自定义CustomAuthorizeAttribute
public class CustomAuthorizeAttribute : TypeFilterAttribute
{
public CustomAuthorizeAttribute(int input) : base(typeof(CustomAuthorize))
{
Arguments = new object[] { input };
}
}
使用
[CustomAuthorizeAttribute(1)]
public IActionResult About()
我正在尝试实施一项非常精细的政策。 这个想法就像图像中一样。
每个实体与右边的实体总是一对多关系。 一个机构可以有很多课程,每个课程可以有很多学科, 每个 Subject 可以有很多 Syllabus, 等等...
有 3 个角色:Administrator
、Contributor
、Viewer
如果您在顶级实体之一中拥有角色,则该角色将传播到下面的其余实体。 例如:如果您是课程管理员,您就是学科、教学大纲等的管理员...
如果您是其中一个教学大纲的贡献者,您将成为本教学大纲的以下课程和视频的贡献者。
我尝试使用 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
,例如
自定义
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(); } } }
自定义
CustomAuthorizeAttribute
public class CustomAuthorizeAttribute : TypeFilterAttribute { public CustomAuthorizeAttribute(int input) : base(typeof(CustomAuthorize)) { Arguments = new object[] { input }; } }
使用
[CustomAuthorizeAttribute(1)] public IActionResult About()