首页 > 解决方案 > ASP.NET Core 中 Swagger 5 中的 AuthorizeCheckOperationFilter

问题描述

我一直在旧版本的 Swagger 中使用这种方法:

        public class AuthorizeCheckOperationFilter : IOperationFilter
    {
        public void Apply(Operation operation, OperationFilterContext context)
        {
            var authAttributes = context.MethodInfo.DeclaringType.GetCustomAttributes(true)
                .Union(context.MethodInfo.GetCustomAttributes(true))
                .OfType<AuthorizeAttribute>();
            if (authAttributes.Any())
            {
                operation.Responses.Add("401", new Response { Description = "Unauthorized" });                    

                operation.Security = new List<IDictionary<string, IEnumerable<string>>>
                                     {
                                         new Dictionary<string, IEnumerable<string>>
                                         {
                                             { "oauth2", new[] { "myscope" } }
                                         }
                                     };
            }


        }
    }

但是,现在界面变成了这样:

    public class AuthorizeCheckOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        throw new NotImplementedException();
    }
}

如何转换代码?:-)

非常感谢!贡纳尔

标签: asp.net-core.net-coreswaggerswagger-ui

解决方案


您可以参考官方 github 文档进行如下更改:

public class AuthorizeCheckOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        var authAttributes = context.MethodInfo
        .GetCustomAttributes(true)
        .OfType<AuthorizeAttribute>()
        .Select(attr => attr.Policy)
        .Distinct();
        if (authAttributes.Any())
        {
            operation.Responses.Add("401", new OpenApiResponse { Description = "Unauthorized" });
            var oAuthScheme = new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "oauth2" }
            };

            operation.Security = new List<OpenApiSecurityRequirement>
            {
                new OpenApiSecurityRequirement
                {
                    [ oAuthScheme ] = authAttributes.ToList()
                }
            };               
        }
    }
}

推荐阅读