带有 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 添加到 header
的 authorization
部分,所以当从 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() 函数。
我构建了一个 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 添加到 header
的 authorization
部分,所以当从 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() 函数。