ASP .NET核心授权处理程序:获取单个失败的需求

时间:2018-05-25 22:30:29

标签: c# asp.net-core authorization

假设某个政策SomePolicy包含IAuthorizationRequirement添加的列表:

services.AddAuthorization(options =>
{
    options.AddPolicy("SomePolicy", policy =>
        {
            policy.AddRequirements(new FooRequirement());
            policy.AddRequirements(new BarRequirement());
            policy.AddRequirements(new YetAnotherRequirement());
        });
});

执行该政策后,我想知道哪项要求失败,并阻止检查剩余的要求。

查看我可以用API做什么,似乎在执行策略后,我唯一能做的就是检索失败需求列表。

var authorizationResult = _authorizationService.AuthorizeAsync(this.User, ressource, "SomePolicy");
var failedRequirements = authorizationResult.Result.Failure.FailedRequirements

基于政策的方法是否不适合我想要实现的目标? 我应该为每项要求制定专门的政策吗?

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

每个需求都需要有一个处理程序调用 context.Succeed(requirement),并且没有任何处理程序调用 context.Failed()

InvokeHandlersAfterFailure 是一种在调用 context.Failed() 后针对特定要求短路处理程序调用的方法,但这在 IMO 中不是很有用。

我正在尝试通过向 IAuthorizationService 添加扩展方法来获得短路评估:

public static async Task<AuthorizationResult> AuthorizeAnyAsync(this IAuthorizationService service, ClaimsPrincipal user,
    object? resource, params IAuthorizationRequirement[] requirements)
{
    AuthorizationResult? result = null;
    foreach (var requirement in requirements)
    {
        result = await service.AuthorizeAsync(user, resource, requirement);
        if (result.Succeeded || result.Failure.FailCalled)
            return result;
    }
    return result!;
}