如何修复 API 密钥在 Swagger 标头中作为 Null 传递的问题

问题描述 投票:0回答:2

我已向 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 检索到的值

如有任何建议,我们将不胜感激。

c# header swagger api-key
2个回答
0
投票

好吧,终于自己解决了这个问题,我添加了以下内容;

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

这用于将 ApiKey 参数放置在 Swagger 中,这就是我想要实现的目标。

但是,似乎应该从此处调用授权或单击每个控制器上的挂锁图标。

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

似乎没有人能够在这方面向我指出任何一个方向。


0
投票

在我的例子中,我以这种方式配置了类元数据,

import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.security.SecurityRequirements;
import io.swagger.v3.oas.annotations.security.SecurityScheme;
import io.swagger.v3.oas.annotations.security.SecuritySchemes;


@SecuritySchemes({
    @SecurityScheme(
        name = "Authorization",
        type = SecurityScheme.Type.APIKEY,
        in = SecurityScheme.In.HEADER,
        paramName = "Authorization"
    )
})
@SecurityRequirements({
    @SecurityRequirement(name = "Authorization")
})
@OpenAPIDefinition(
    // ... 
)
public class Metadata {
    // ...  
}

成功了!希望有帮助

© www.soinside.com 2019 - 2024. All rights reserved.