Пользовательский интерфейс Swashbuckle Swagger с apikey и appid - PullRequest
0 голосов
/ 25 марта 2020

Я создал 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".

1 Ответ

0 голосов
/ 02 апреля 2020

Я сейчас решил это. Это не красиво, потому что я сделал специальную проверку, когда вызов поступил от чванства.

Значения "appId" и "apiKey", которые я добавил (см. Вопрос выше), извлекаются из объекта HttpAuthentication. HttpAuthentication .Request.Properties ["MS_HttpContext"] содержит HttpContextWrapper, чей .Items ["MS_HttpRequestMessage"] содержит HttpRequestMessage и в этой хеш-таблице я могу получить мои "appId" и "apiKey" с помощью функции 0.Get.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...