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

Ang*_*ker 7 c# swagger .net-core swashbuckle

我有一个 .NET Core 2.x 项目,它集成了 Swagger 和 Swashbuckle v4.x。这一切都运作得非常好。

但是,现在我需要以 www.foo.com/myendpoint? 的形式向 Swagger 触发的每个 GET 附加一个查询字符串?authorization=APIKEY。为此,我在 Startup.ConfigureServices 中有以下内容:

services.AddSwaggerGen(c => {
  c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });

  c.AddSecurityDefinition("api key", new ApiKeyScheme() {
      Description = "Authorization query string expects API key",
      In = "query",
      Name = "authorization",
      Type = "apiKey"
  });
}); 
Run Code Online (Sandbox Code Playgroud)

当我启动 swagger 时,它确实会向我显示一个对话框,并在我输入 API 密钥时成功接受它。但是,所有 API 调用仍然会在没有查询字符串的情况下发出。

我缺少什么?

在此输入图像描述

Jon*_*ase 8

特别是对于 Swashbuckle,(NSwag 有自己的注册授权流的方法)仅仅定义安全定义是不够的,您还需要注册使用它的操作。

由于您想要将 api-key 附加到所有操作,因此您的用例非常简单:只需注册定义的安全要求,您可以这样做:

c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>> { { "api key", new[] {} } };
Run Code Online (Sandbox Code Playgroud)

您可以在此处详细了解如何为您的操作定义、自定义和注册不同的授权方案。

对于即将推出的 Swashbuckle v5,可以使用以下代码:

c.AddSecurityDefinition("api key", new OpenApiSecurityScheme {
    Type = SecuritySchemeType.ApiKey,
    In = ParameterLocation.Query,
    Name = "authorization",
    Description = "Authorization query string expects API key"
});

var key = new OpenApiSecurityScheme() { Name = "api key"};
var requirement = new OpenApiSecurityRequirement {
    { key, new List<string>() }
};
c.AddSecurityRequirement(requirement);
Run Code Online (Sandbox Code Playgroud)

  • 我想到了。添加了您的答案。 (2认同)
  • 对于未来的读者,对于 Swashbuckle AspNetCore v6.2.3,我必须将 `new OpenApiSecurityScheme() { Name = "api key"}` 更改为 `new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id="api key"}}` (或者在我的情况下,用常量代替“api key”)根据[自述文件](https://github.com/domaindrivendev/Swashbuckle.AspNetCore#add-security-definitions-and-要求)。 (2认同)