带有 apikey 和 appid 的 Swashbuckle swagger UI

Swashbuckle swagger UI with apikey and appid

我构建了一个 API,它使用 appid 和 apikey 进行身份验证。当我使用 appid 和 apikey 从其他应用程序调用 API 时它工作正常,但我在使用 /swagger URL 中的 API 函数时遇到问题。我可以在 swagger UI 的顶部输入一个 apikey,但我似乎无法在任何地方输入 appid。

我一直在查看其他类似的问题并尝试了那里的建议。

我是 运行 .Net Framework 4.7.2 web API 应用程序上的 Swashbuckle v5.6.0。

我已经添加了

c.ApiKey("apiKey")
  .Description("API Key Authentication") // first key
  .Name("Authorization")
  .In("header");
c.ApiKey("appId")
  .Description("API Key Authentication") // second key
  .Name("Authorization")
  .In("header");

给我的 GlobalConfiguration.Configuration.EnableSwagger(c =>

c.EnableApiKeySupport("apiKey", "header");
c.EnableApiKeySupport("appId", "header");

给我的 .EnableSwaggerUi(c =>

(均在 SwaggerConfig.cs)

当我从另一个应用程序调用 API 时,我使用 DelegatingHandler 将 apiKey 和 appId 添加到 headerauthorization 部分,所以当从 swagger UI(例如 http://my.api.com/myapi/swagger)调用函数时我想做什么。我已经看到有一种方法可以将授权按钮添加到 swagger UI 中,当您单击该按钮时,您可以添加诸如 appId 之类的东西,但是我如何在我的 swagger UI 中获取该按钮?或者还有其他方法吗?

更新 1

我发现我需要实现 IOperationFilter,主要是因为它在 SwaggerConfig 的评论中这样说(天啊!):

// you'll need to implement a custom IDocumentFilter and/or IOperationFilter to set these properties
// according to your specific authorization implementation
    public class AddRequiredAuthorizationHeaderParameter : IOperationFilter
    {
        public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
        {
            if (operation.parameters == null)
                operation.parameters = new List<Parameter>();

            operation.parameters.Add(new Parameter
            {
                name = "appId",
                @in = "header",
                type = "string",
                required = true,
                schema = new Schema { @ref = "amx"},
                description = "appID",

            });
        }
    }

有了这个,我可以在调用函数时在 swagger UI 中添加 appId 键,顶部有一个 apiKey 字段,所以我认为这就是我所需要的。

但是,我似乎无法在授权 header 上设置正确的模式(您可以在上面看到我尝试使用 schema = new Schema { @ref = "amx"} 设置为 "amx"。当我发出请求然后检查我的 HttpAuthenticationContext.Request.Headers.Authorization.Scheme 不是我想要的 "amx" 时,而是我在调用时输入的 appID,所以我的 authentication-process 不赞成它.

所以现在我只是想弄清楚如何将 HttpAuthenticationContext.Request.Headers.Authorization.Scheme 设置为 "amx"。

我现在已经解决了这个问题。这不是很好,因为我特别检查了何时来自 swagger 的调用。

我添加的 "appId" 和 "apiKey" 值(参见上面的问题)可从 HttpAuthentication 对象中检索。 HttpAuthentication .Request.Properties["MS_HttpContext"] 包含一个 HttpContextWrapper,其 .Items["MS_HttpRequestMessage"] 包含一个 HttpRequestMessage 并且在该哈希表中我可以获得我的 "appId" 和 "apiKey" .GetValues() 函数。