这个问题涉及this so question中概述的更大目标。回顾一下
仅当主体可以访问这些组件(无论是角色还是基于策略)时,我才想显示导航树的组件。
在上一个问题中,我将有一个属于控制器和动作的自动化过滤器列表。一旦我有IHttpContextAccessor的实例并因此有了ClaimsPrincipal,我如何测试主体是否会通过所有上述授权过滤器列表?
也就是说,如果我嘲笑像:
var mockAuthFilter = new AuthorizationFilterContext(...);
foreach (IAsyncAuthorizationFilter filter in filterListForGivenAction)
{
await filter.OnAuthorizationAsync(mockAuthFilter);
问题是 - 我如何测试对OnAuthorizationAsync的任何调用是否失败?
或者,是否会有更好的方法来确保导航树仅显示授权主体根据AuthorizeAttribute(策略和/或角色)查看的节点/叶子。
答案 0 :(得分:0)
如果我仔细查看了AuthorizationFilterContext属性的注释,就写在那里 -
[Result] - 将Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext.Result设置为授权过滤器内的非空值将使过滤器管道的其余部分短路。
因此该方法最终成为:
private async Task<bool> IsValid(IEnumerable<IAsyncAuthorizationFilter> filters, ActionContext actionContext)
{
var context = new AuthorizationFilterContext(actionContext, filters.Cast<IFilterMetadata>().ToList());
foreach (var f in filters)
{
await f.OnAuthorizationAsync(context);
if (context.Result != null)
{
return false;
}
}
return true;
}