Я создал API, который использует appid и apikey для аутентификации. Он прекрасно работает, когда я вызываю API из других приложений, используя appid и apikey, но у меня возникают проблемы с использованием функций API из URL / swagger. Я могу ввести apikey в верхней части чванливого пользовательского интерфейса, но я не могу нигде ввести appid.
Я смотрел на другие подобные вопросы и пробовал то, что там предлагалось.
Я использую Swashbuckle v5.6.0 на веб-API. Net Framework 4.7.2.
Я добавил
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 к authorization
части header
, так что я хочу делать при вызове функций из пользовательского интерфейса Swagger (например, http://my.api.com/myapi/swagger ). Я видел, что есть способ добавить кнопку авторизации в пользовательский интерфейс Swagger, и когда вы нажимаете эту кнопку, вы можете добавить такие вещи, как appId, но как мне получить эту кнопку в моем пользовательском интерфейсе Swagger? Или есть другой способ сделать это?
Обновление 1
Я понял, что мне нужно реализовать IOperationFilter, главным образом потому, что это так прямо сказано в комментарии в SwaggerConfig (d'oh!):
// 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",
});
}
}
Благодаря этому я могу добавить ключ appId в пользовательском интерфейсе сваггера при вызове функции, и в верхней части есть поле apiKey, поэтому я подумаю это все, что мне нужно.
Однако я не могу установить правильную схему в заголовке авторизации (который вы видите выше, я пытался установить «amx» с помощью schema = new Schema { @ref = "amx"}
. Когда я выполнить мой запрос, а затем проверить, что мой HttpAuthenticationContext.Request.Headers.Authorization.Scheme
- это не «amx», который я хочу, а appID, который я ввожу, когда выполняю вызов, поэтому мой процесс аутентификации не подтверждает его.
Итак сейчас я просто пытаюсь понять, как установить HttpAuthenticationContext.Request.Headers.Authorization.Scheme
в "amx".