C#:Swagger / Swashbuckle-使用“ AND”连接安全方案

rbr94

我有一个ASP.NET Core Api,在其中需要对一个操作使用多种身份验证方案。我试图通过在Swagger UI中显示所有必需的身份验证方案来记录这些操作。因此,我使用Swashbuckle.AspNetCore(5.1.0)库用于动态加入OpenApiSecurityRequirementOpenApiOperation在一个IOperationFilter

if (authorizeAttributes.Any(x => x.AuthenticationSchemes.Contains(InternalControllerBasicAuthentication.AuthenticationScheme)))
{
       requirements.Add(new OpenApiSecurityRequirement
       {
             {
                   new OpenApiSecurityScheme {
                        Reference = new OpenApiReference {
                            Type = ReferenceType.SecurityScheme,
                            Id = "credentials"
                        }
                   },
                   new [] { "Basic <credentials-value>" }
             }
      });
} 

if (authorizeAttributes.Any(x => x.AuthenticationSchemes.Contains(OneTimePasswordAuthentication.AuthenticationScheme)))
{
      requirements.Add(new OpenApiSecurityRequirement
      {
             {
                   new OpenApiSecurityScheme {
                        Reference = new OpenApiReference {
                            Type = ReferenceType.SecurityScheme,
                            Id = "one-time-password"
                        }
                   },
                   new [] { "Basic <one-time-password-value>" }
             }
      });
}

operation.Security = new List<OpenApiSecurityRequirement>(requirements);

此外,我使用SwaggerGenOptions来注册所有可能的方案:

var oneTimePasswordScheme = new OpenApiSecurityScheme
{
    Name = "one-time-password",
    In = ParameterLocation.Header,
    Scheme = "one-time-password",
    Type = SecuritySchemeType.ApiKey
};

options.AddSecurityDefinition("one-time-password", oneTimePasswordScheme);

var credentialsScheme = new OpenApiSecurityScheme
{
    Name = "credentials",
    In = ParameterLocation.Header,
    Scheme = "credentials",
    Type = SecuritySchemeType.ApiKey
};

options.AddSecurityDefinition("credentials", credentialsScheme);

除了OR在用户界面中使用连接器的Swagger之外,其他所有功能均正常运行

在此处输入图片说明

有没有办法使用AND连接器配置Swagger

任何帮助将不胜感激!

rbr94

不必OpenApiSecurityRequirement为每个对象添加一个OpenApiSecurityScheme,而是必须将所有OpenApiSecurityScheme对象放到一个对象中OpenApiSecurityRequirement

将安全性要求与OR关联

var requirements = new List<OpenApiSecurityRequirement>();
requirements.Add(new OpenApiSecurityRequirement
{
    {
        new OpenApiSecurityScheme {
            Reference = new OpenApiReference {
                Type = ReferenceType.SecurityScheme,
                Id = "scheme-1"
            }
        },
        new [] { "scheme-1-value" }
    }
});

requirements.Add(new OpenApiSecurityRequirement
{
    {
        new OpenApiSecurityScheme {
            Reference = new OpenApiReference {
                Type = ReferenceType.SecurityScheme,
                Id = "scheme-2"
            }
        },
        new [] { "scheme-2-value" }
    }
});

operation.Security = new List<OpenApiSecurityRequirement>(requirements);

将安全要求与AND连接起来

var requirement = new OpenApiSecurityRequirement();
requirement.Add(new OpenApiSecurityScheme {
        Reference = new OpenApiReference {
            Type = ReferenceType.SecurityScheme,
            Id = "scheme-1"
        }
    },
    new [] { "scheme-1-value" }
);

requirement.Add(new OpenApiSecurityScheme {
        Reference = new OpenApiReference {
            Type = ReferenceType.SecurityScheme,
            Id = "scheme-2"
        }
    },
    new [] { "scheme-2-value" }
);

operation.Security = new List<OpenApiSecurityRequirement> { requirement };

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Swashbuckle / Swagger的C#版本WebApi文档

是否可以使用基于目录的版本(webapi / C#)使用swagger / Swashbuckle进行版本控制?

我可以使用Swashbuckle从Blazor项目C#中生成Swagger UI吗?

使用Swagger / Swashbuckle的OAUTH Web API

如何使用 Swashbuckle 在 Swagger 中屏蔽密码

使用Swashbuckle的AWS API Gateway Swagger

使用Swashbuckle Swagger上载文件

使用Swashbuckle创建时swagger.json的位置

如何使用Swashbuckle在Swagger中设置操作名称

使用Swashbuckle托管现有Swagger.JSON文件

如何使用swagger swashbuckle保护生成的API文档

如何设置SwashBuckle.AspNetCore.Swagger使用授权?

使用Swashbuckle.Swagger手动添加端点

使用Swashbuckle.AspNetCore设置Swagger UI的语法highlight属性

什么是Swagger,Swashbuckle和Swashbuckle UI

WebApi Swagger (Swashbuckle) - 通过代理连接时无法访问 Swagger UI

Swashbuckle Swagger生成实际的向导

如何使用Swashbuckle的SwaggerUI显示静态的swagger.json文件,而不是SwaggerGen的动态创建的定义?

Swagger Swashbuckle Asp.NET Core:显示有关使用每个枚举的详细信息

如何使用Swashbuckle在Swagger API文档/ OpenAPI规范中包含子类?

如何获得Swagger UI以将端口443与Swashbuckle一起使用?

使用ASP.NET Core Web API重命名Swashbuckle 6(Swagger)中的模型

在Swagger / Swashbuckle中为.NET Core使用自定义Index.Html的问题

是否可以使用 SwashBuckle 和 Swagger UI 更改 HTML 标题

使用Swashbuckle Aspnetcore向swagger.json添加`host`,`basePath`和`schemes`

使用Swashbuckle时将全局项目添加到swagger.json

如何使用 Swashbuckle 在 ASP.NET Core 中为 Swagger UI 进行 OAuth2 授权

使用Swashbuckle记录模型属性

将 AllowAnonymousAttribute 与 Swashbuckle 结合使用