如何检查某个操作是否允许匿名访问或是否仅授权?

问题描述 投票:0回答:1

我有一个使用 .NET 5 的基于 ASP.NET Core 的项目。我正在使用 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
属性装饰,而其他操作在控制器级别装饰
isAuthorized
属性,我也会获得
allowAnonymous
[AllowAnonymous]
[Authorize]
值。

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

asp.net-core swagger asp.net-core-webapi swagger-ui .net-5
1个回答
1
投票

您需要像下面这样更改代码来判断操作或控制器是否使用

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.