【问题标题】:How do I fix API Key being passed as Null in Swagger Header如何修复在 Swagger Header 中作为 Null 传递的 API 密钥
【发布时间】:2021-03-22 11:13:18
【问题描述】:

我在 Swagger 中为 API 密钥添加了一个标头参数,这在提供输入 API 密钥的能力方面是有效的。 我正在使用以下

  • Swashbuckle.AspNetCore 6.1
  • Swashbuckle.AspNetCore.Swagger 6.1
  • Swashbuckle.AspNetCore.SwaggerGen 6.1
  • Swashbuckle.AspNetCore.SwaggerUI 6.1

我的代码如下,在 Startup.cs 我有以下添加 Swagger 配置的位置

 public void ConfigureServices(IServiceCollection services)
             services.AddSwaggerGen(config =>
            {
                config.OperationFilter<SwaggerFilter>();
            });


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "Swift Api V1");
                c.RoutePrefix = string.Empty;
            });

整个 Swaggerfilter 代码是

using Swashbuckle.AspNetCore.SwaggerGen;
using System.Collections.Generic;

namespace SwiftApi.Api
{
    public class SwaggerFilter : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            if (operation.Parameters == null)
                operation.Parameters = new List<OpenApiParameter>();

            operation.Parameters.Add(new OpenApiParameter
            {
                Name = "Authorization",
                In = ParameterLocation.Header,
                Schema = new OpenApiSchema { Type = "string" },
                Description = "API Key",
                Required = true
            });
        }
    }
}

但是,在检查标头中传递的值的方法中,这在我的标头值列表中找不到

在网上看了看,我看不到我做错了什么,但显然我遗漏了一些东西,当我使用 Postman 时,我可以看到标题值。

这是我第一次尝试这样做,所以很可能我错过了什么,问题是什么?

从 Postman 检索的值

任何建议将不胜感激。

【问题讨论】:

  • 您捕获的是进入请求的 HTTP 标头。您需要在 HTTPRequest 中为缺少的标头添加一个新标头。
  • 你能详细说明一下吗?
  • 感谢您的链接,但请您详细说明我应该做什么,将其视为告诉我缺少哪一部分,而不是让我猜测。正如我所指出的,这是我以前从未做过的事情,因此不确定我需要使用上述链接的哪一部分(如果有的话)-抱歉。
  • 您有一个包含 HTTP 标头的 HTTP 请求。 Swagger 可能会称它们为其他名称,但它们是 HTTP 标头。您需要修改标题。我的链接中帖子的标题是“我如何告诉 swashbuckle 添加所需的标题”。

标签: c# header swagger api-key


【解决方案1】:

好的,终于自己搞定了,我添加了以下内容;

services.AddSwaggerGen(config =>
        {config.AddSecurityDefinition("Authorization", new 
OpenApiSecurityScheme()
            {
                Type = SecuritySchemeType.ApiKey,
                In = ParameterLocation.Header,
                Name = "Authorization",
                Description = "API Key",
                Scheme = "ApiKeyScheme"
            });
            var key = new OpenApiSecurityScheme()
            {
                Reference = new OpenApiReference
                {
                    Type = ReferenceType.SecurityScheme,
                    Id = "Authorization"
                },
                In = ParameterLocation.Header
            };

            var requirement = new OpenApiSecurityRequirement
            {
                {key, new List<string>() }
            };
            config.AddSecurityRequirement(requirement);

    config.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version= "v1"});

并删除了代码; config.OperationFilter&lt;SwaggerFilter&gt;();

这里是用来在Swagger中放置ApiKey参数的,这也是我想要实现的。

但是,似乎应该从这里调用 Authorize 或单击每个控制器上的挂锁图标。

我试图让参数工作,但无论我做什么,它总是返回一个 Null。现在我不确定当您将更改应用到配置时是否必须使用 Swagger 中出现的新授权按钮,但它可以在 Swagger 中进行测试,我更喜欢 API Key 参数,如图所示在第一张图片中,当我添加密钥然后从请求标头中提取它时工作。

似乎没有人能够就此向我指出任何一个方向。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2012-03-24
    • 1970-01-01
    • 2021-02-20
    • 2015-09-06
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 2023-01-28
    相关资源
    最近更新 更多