Asp.net core mvc 测试调用IAsyncAuthorizationFilter.OnAuthorizationAsync是否失败

Asp.net core mvc 测试调用IAsyncAuthorizationFilter.OnAuthorizationAsync是否失败,asp.net-core-mvc,Asp.net Core Mvc,这个问题涉及到本节中概述的一个更大的目标。重述 我希望仅当主体可以访问导航树的组件(无论是基于角色还是基于策略)时,才显示这些组件 在前面的问题中,我将列出属于控制器和操作的自动化过滤器。一旦我有了IHttpContextAccessor的一个实例以及ClaimsPrincipal,我该如何测试主体是否通过了上面提到的所有授权过滤器列表 也就是说,如果我模拟了这样的东西: var mockAuthFilter = new AuthorizationFilterContext(...); fore

这个问题涉及到本节中概述的一个更大的目标。重述

我希望仅当主体可以访问导航树的组件(无论是基于角色还是基于策略)时,才显示这些组件

在前面的问题中,我将列出属于控制器和操作的自动化过滤器。一旦我有了IHttpContextAccessor的一个实例以及ClaimsPrincipal,我该如何测试主体是否通过了上面提到的所有授权过滤器列表

也就是说,如果我模拟了这样的东西:

var mockAuthFilter = new AuthorizationFilterContext(...);
foreach (IAsyncAuthorizationFilter filter in filterListForGivenAction)
{ 
    await filter.OnAuthorizationAsync(mockAuthFilter);
问题是-如何测试对OnAuthorizationAsync的调用是否失败


或者,是否有更好的方法来确保导航树仅显示主体根据authorized属性(策略和/或角色)有权查看的节点/叶如果我仔细查看了AuthorizationFilterContext-

[结果]-将授权筛选器内的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;
}
私有异步任务有效(IEnumerable筛选器,ActionContext ActionContext)
{
var context=newauthorizationFilterContext(actionContext,filters.Cast().ToList());
foreach(过滤器中的var f)
{
等待f.OnAuthorizationAsync(上下文);
if(context.Result!=null)
{
返回false;
}
}
返回true;
}