ASP .NET Core 授权处理程序:获取单个失败要求



假设策略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

基于策略的方法是否不适合我想要实现的目标? 我应该为每个要求创建专用策略吗?

任何帮助将不胜感激,谢谢!

每个要求都需要由其中一个处理程序调用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!;
}

最新更新