测试是否调用IAsyncAuthorizationFilter.OnAuthorizationAsync失败

时间:2017-07-11 00:27:29

标签: asp.net-core-mvc

这个问题涉及this so question中概述的更大目标。回顾一下

  

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

在上一个问题中,我将有一个属于控制器和动作的自动化过滤器列表。一旦我有IHttpContextAccessor的实例并因此有了ClaimsPrincipal,我如何测试主体是否会通过所有上述授权过滤器列表?

也就是说,如果我嘲笑像:

var mockAuthFilter = new AuthorizationFilterContext(...);
foreach (IAsyncAuthorizationFilter filter in filterListForGivenAction)
{ 
    await filter.OnAuthorizationAsync(mockAuthFilter);

问题是 - 我如何测试对OnAuthorizationAsync的任何调用是否失败?

或者,是否会有更好的方法来确保导航树仅显示授权主体根据AuthorizeAttribute(策略和/或角色)查看的节点/叶子。

1 个答案:

答案 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;
}