首页 > 解决方案 > 如何检查操作是否允许匿名访问或仅授权?

问题描述

我有一个基于 ASP.NET 5 的项目。我正在使用 SwaggerUI 生成文档。我需要实现IOperationFilter将所需参数添加到任何不允许匿名访问的路由。

使用 Swagger 操作过滤器,我确实可以访问ControllerActionDescriptor. 但是,我找不到成功的方法来检查该操作是否允许匿名访问。

这是我所做的

public class AddTenantHeaderParameterOperationFilter : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            var filterDescriptor = context.ApiDescription.ActionDescriptor.FilterDescriptors;
            bool isAuthorized = filterDescriptor.Select(filterInfo => filterInfo.Filter).Any(filter => filter is IAsyncAuthorizationFilter);
            bool allowAnonymous = filterDescriptor.Select(filterInfo => filterInfo.Filter).Any(filter => filter is IAllowAnonymousFilter);

            if (!isAuthorized || allowAnonymous)
            {
                // we don't need to add header for anonymous allowed actions
                return;
            }

            //.. add the headers
        }
    }

上面代码中的问题是我得到false了两者的价值isAuthorizedallowAnonymous即使某些动作用属性修饰[AllowAnonymous]而其他动作[Authorize]在控制器级别修饰了属性。

如何正确判断一个操作是允许匿名访问还是仅允许授权访问?

标签: asp.net-coreswaggerasp.net-core-webapiswagger-uiasp.net5

解决方案


您需要更改代码,如下所示,以判断动作或控制器是否使用Authorize/AllowAnonymous属性声明:

public class AddTenantHeaderParameterOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {       
        bool isAuthorized = context.MethodInfo.DeclaringType.GetCustomAttributes(true).OfType<AuthorizeAttribute>().Any() ||
           context.MethodInfo.GetCustomAttributes(true).OfType<AuthorizeAttribute>().Any();
        bool allowAnonymous = context.MethodInfo.DeclaringType.GetCustomAttributes(true).OfType<AllowAnonymousAttribute>().Any() ||
           context.MethodInfo.GetCustomAttributes(true).OfType<AllowAnonymousAttribute>().Any();

        if (!isAuthorized || allowAnonymous)
        {
            // we don't need to add header for anonymous allowed actions
            return;
        }

        //.. add the headers
    }
}

推荐阅读