为什么需要多个处理程序?

    • 条件 1:用户必须是 Admin 角色,并且拥有 claim.Type == “Edit Role” 且值为 true。并且登录用户 ID 不能与正在编辑的 Admin 用户 ID 相同
    • 条件 2:用户必须是 Super Admin 角色,即可编辑角色和管理用户中的角色

    image.png
    SuperAdminHandler:

    1. public class SuperAdminHandler : AuthorizationHandler<ManageAdminRolesAndClaimsRequirement>
    2. {
    3. protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ManageAdminRolesAndClaimsRequirement requirement)
    4. {
    5. if (context.User.IsInRole("Super Admin"))
    6. {
    7. context.Succeed(requirement);
    8. }
    9. return Task.CompletedTask;
    10. }
    11. }

    image.png

    • 如果一个授权需求有多个处理程序,失败是优于成功的。这意味着当其中一个处理程序返回失败时即(context.Fail()),即使其他处理程序返回成功(context.Succeed()),策略也会失败
    • 如果没有任何处理程序返回显式成功即(context.Succeed()),则该策略将不会成功
    • 所以通常为了让策略能够成功,必须再其中一个处理程序返回显式成功,并且其他任何处理程序都不得返回显式失败
    • 一般来说不建议在处理程序返回失败,因为满足相同要求的其他处理程序可能会成功