【问题标题】:SwaggerUI not adding ApiKey to Header with Swashbuckle (5.x)SwaggerUI 不使用 Swashbuckle (5.x) 将 ApiKey 添加到 Header
【发布时间】:2019-07-26 23:16:40
【问题描述】:

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

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

我现在遇到的问题是让 Swagger 在我的请求标头中添加一个 ApiKey。我按照这些不同帖子中提到的添加 ApiKey 安全定义/要求的说明进行操作:

API key in header with swashbuckle

Empty authorization header on requests for Swashbuckle.AspNetCore

How to force Swagger/Swashbuckle to append an API key?

但是,ApiKey 值从未添加到 Header。

这就是我的创业公司:

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

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

【问题讨论】:

  • 闻起来像个 bug……最好直接在项目的 github 页面上报告

标签: asp.net-core swashbuckle


【解决方案1】:

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

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);

【讨论】:

  • 你一直在寻找那个!我找到工作的唯一方法!
  • @TheWizardOfTN 不知道你是什么意思?您自己提供密钥(在浏览器中,打开 swagger 后),您需要先授权 Swagger,然后才能使用 API
【解决方案2】:

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

Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "ApiKeyAuth" }

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

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

【讨论】:

  • 正如@Meh Man 的回答所暗示的那样,上面的 Id 需要与 SecurityDefinition Name 相同。 Swashbuckle.AspNetCore v5.5.1.
【解决方案3】:

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

【讨论】:

  • 我很难找到为什么我的 Swagger UI 没有在调用中正确发送标头。原因是 OpenApiReference Id 与定义名称不同。谢谢老哥!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 2019-05-16
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多