Подтвердить что ты не робот

Включить токен на предъявителя в Swashbuckle (документ Swagger)

Я создал приложение asp.net webapi, которое использует Индивидуальную учетную запись, чтобы токен-носитель был включен по умолчанию. Он отлично работает, так что я могу проверить их в Postman без проблем.

Здесь возникает вопрос, когда я пытаюсь интегрировать интерфейс Swagger с помощью Swashbuckle. Я установил Swashbuckle:

Установочный пакет Swashbuckle

Затем измените SwaggerConfig.cs:

GlobalConfiguration.Configuration
    .EnableSwagger(c =>
    {
        c.ApiKey("Token")
            .Description("Filling bearer token here")
            .Name("Authorization")
            .In("header");
    }
    .EnableSwaggerUi(c =>
    {
        c.EnableApiKeySupport("Authorization", "header");
    };

Запустите мое приложение и заполните токен носителя:

введите описание изображения здесь

Но это не работает, когда я запускаю запрос api, которому требуется авторизация. Вот скриншот:

введите описание изображения здесь

Маркер-носитель добавляется в Авторизация в заголовке. Но у меня все еще есть ошибка 401. Мне интересно, это потому, что токен закодирован (SPACE заменен на %20)? Есть идеи? Спасибо.

Кстати, мне интересно, как добавить /токен в мой документ Swagger, чтобы я мог получить токен в пользовательском интерфейсе Swagger.

4b9b3361

Ответ 1

Update

Ниже приведена проблема, описанная ниже в Swashbuckle v5.5.0.

Проблема

Просто столкнулся с той же проблемой. Я думаю, что первопричиной является эта строка в Исходный код Swashbuckle:

var key = encodeURIComponent($('#input_apiKey')[0].value);

Здесь значение из поля ввода HTML проходит через URL-кодирование, превращая пространство в %20. Я планирую открыть проблему в Swashbuckle repo на GitHub.

Обход

Пока эта проблема не будет решена, обходной путь основан на замене вышеприведенной строки с использованием файла Javascript, введенного в интерфейс Swagger:

  • В проекте, где установлен Swashbuckle, создайте новую папку и назовите ее "Swagger".

  • В новой папке создайте новый файл Javascript под названием "SwaggerUiCustomization.js" и поместите в него script: (function () { function addApiKeyAuthorization() { var key = $('#input_apiKey')[0].value; if (key && key.trim() != "") { var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization(swashbuckleConfig.apiKeyName, key, swashbuckleConfig.apiKeyIn); window.swaggerUi.api.clientAuthorizations.add("api_key", apiKeyAuth); log("added key " + key); } } $('#input_apiKey').change(addApiKeyAuthorization); })();

  • В обозревателе решений выберите файл и нажмите Alt + Enter, чтобы изменить его Свойства. В окне свойств измените файл Build Action на Embedded Resource.

  • В вашем файле SwaggerConfig.cs добавьте следующую строку внутри блока кода EnableSwaggerUi(): c.InjectJavaScript(thisAssembly, "<Project_Default_Namespace>.Swagger.SwaggerUiCustomization.js");
    Конечно, замените <Project_Default_Namespace> на пространство имен по умолчанию для проекта.

  • Запустите проект и введите "Знамя" в текстовое поле. Когда вы вызываете действие контроллера, вы должны получить это то же самое значение - с пробелом вместо %20% - на стороне сервера.