SwaggerUI 没有将 ApiKey 添加到带有 Swashbuckle 的 Header (5.x)

Jus*_*olf 8 swashbuckle asp.net-core

我正在使用 Swashbuckle.AspNetCore 5.0.0 为我的 .Net Core WebApi 项目生成 Swagger 文档,并且在大多数情况下,一切正常。

我已经使用 ApiKey 设置了一些简单的身份验证,效果很好。

我现在遇到问题的地方是让 Swagger 将 ApiKey 添加到我的请求标头中。我按照说明添加了 ApiKey 安全定义/要求,如这些不同的帖子中所述:

带有 swashbuckle 的标头中的 API 密钥

Swashbuckle.AspNetCore 请求的空授权标头

如何强制 Swagger/Swashbuckle 附加 API 密钥?

但是,ApiKey 值永远不会添加到 Header 中。

这就是我在启动时所拥有的:

c.AddSecurityDefinition("ApiKey",
    new OpenApiSecurityScheme
    {
         Description = "ApiKey must appear in header",
         Type = SecuritySchemeType.ApiKey,
         Name = Constants.ApiKeyHeaderName,
         In = ParameterLocation.Header
     });
Run Code Online (Sandbox Code Playgroud)

c.AddSecurityRequirement(new OpenApiSecurityRequirement
{
   { 
       new OpenApiSecurityScheme 
       {
            Name = Constants.ApiKeyHeaderName, 
            Type = SecuritySchemeType.ApiKey, 
            In = ParameterLocation.Header
       },
       new List<string>()}
    });

Run Code Online (Sandbox Code Playgroud)

Paw*_*cki 15

我自己一直在努力解决这个问题,但发现除了添加适当的引用之外,您还必须在定义中指定方案,这是正确为我工作的代码:

c.AddSecurityDefinition("ApiKey", new OpenApiSecurityScheme()
{
    Name = "x-api-key",
    In = ParameterLocation.Header,
    Type = SecuritySchemeType.ApiKey,
    Description = "Authorization by x-api-key inside request's header",
    Scheme = "ApiKeyScheme"
});

var key = new OpenApiSecurityScheme()
{
    Reference = new OpenApiReference
    {
        Type = ReferenceType.SecurityScheme,
        Id = "ApiKey"
    },
    In = ParameterLocation.Header
};
var requirement = new OpenApiSecurityRequirement
{
   { key, new List<string>() }
};
c.AddSecurityRequirement(requirement);
Run Code Online (Sandbox Code Playgroud)


Meh*_*Man 8

重要提示是name中必须与中AddSecurityDefinition相同。可以是每个字符串。IdOpenApiReferencename


Jus*_*olf 6

好的,我终于能够让它发挥作用了。我需要将 OpenApiReference 的实例添加到提供给 c.AddSecurityRequirement() 的 OpenApiSecurityScheme 对象

Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "ApiKeyAuth" }
Run Code Online (Sandbox Code Playgroud)

我不得不说这方面的文档有点令人困惑。可能不是一小部分,因为互联网上发布的任何内容都永远存在,而且由于框架的变化,我发现的关于整个事情的许多帖子不再适用:)

现在我只需要弄清楚如何发送另一个标头值以及 api-key,我将完成这部分