Ограничьте доступ к определенным контроллерам API в Swagger с помощью Swashbuckle и ASP.NET Identity.

Итак, я начал использовать Swagger. Я абсолютно влюблен в его функции, но у меня есть некоторые сомнения в доступности всех методов для публики.

Насколько я понял, все включенные в Swaschbuclke методы "auth" на самом деле касаются самих API, но мне здесь не нужна помощь - все мои API защищены парой идентификатор/ключ API.

Я хотел бы каким-то образом использовать ASP.NET Identity (систему входа) для ограничения доступа к странице API (/swagger/ui/index).

Там в любом случае? Любые методы в Swashbuckle? Любые маршруты/Identity хаки?

Любая помощь приветствуется.

Редактировать 1: атрибут [ApiExplorerSettings(IgnoreApi = true)] - это не то, что я ищу, - он ограничивает весь доступ к методам, независимо от идентификатора.


person Mikhail Neverov    schedule 16.10.2015    source источник


Ответы (3)


Относительно ограничения доступа к отдельным API в вашей документации swagger:

Swashbuckle 5.x:

В Swashbuckle 5.x есть параметр конфигурации IgnoreObsoleteActions (который вам нужно установить; он не включен по умолчанию), который будет скрывать действия, если они имеют атрибут [Obsolete].

Пример: конфигурация

httpConfiguration
    .EnableSwagger(c =>
        {
            c.IgnoreObsoleteActions();
        });

Дополнительная информация доступна в документации.

Swashbuckle 4.1.x (или если вы не хотите использовать устаревший атрибут):

Swashbuckle создает документацию swagger поверх IApiExplorer. Вы должны иметь возможность добавить атрибут -- [ApiExplorerSettings(IgnoreApi = true)] -- для управления ApiExplorerSettings классом контроллера или отдельными методами контроллера, чтобы проводник (а впоследствии и Swashbuckle) игнорировал их при создании документации.

Пример: отдельные действия

/// Ignore 'GetFoo' in documentation
public class FooBarController
{
    [ApiExplorerSettings(IgnoreApi = true)]
    public Bar GetFoo
    {
       ...
    }

    public Bar GetBar
    {
       ...
    }
}

Пример: классы контроллера

/// Ignore every controller method in FooBarController in documentation
[ApiExplorerSettings(IgnoreApi = true)]
public class FooBarController
{
    public Bar GetFoo
    {
       ...
    }

    public Bar GetBar
    {
       ...
    }
}

Дополнительные сведения см. в этом выпуске GitHub. Я сам использовал это в Swashbuckle 4.1.x.

person Anthony Neace    schedule 16.10.2015
comment
Привет. Я очень ценю ответ. Но, к сожалению, [ApiExplorerSettings(IgnoreApi = true)] скрывает API от всех пользователей без его статуса Identity/roles/auth на фактическом сайте (и AspUser) - person Mikhail Neverov; 17.10.2015
comment
Спасибо за этот ответ! Работает отлично. - person jfl; 25.02.2016
comment
Это прекрасно работает — приятно скрыть некоторые конечные точки, которые я обычно создаю для небольших тестов. - person Mário Meyrelles; 10.03.2017

Добавьте класс SwaggerAccessMessageHandler.cs в свой проект.

SwaggerAccessMessageHandler.cs:

public class SwaggerAccessMessageHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        if (IsSwagger(request))
        {
            if (!Thread.CurrentPrincipal.Identity.IsAuthenticated)
            {
                // Unauthorized access to swagger 
                // do any things like : return Unauthorized or NotFound
                var response = request.CreateResponse(HttpStatusCode.Unauthorized);
                return Task.FromResult(response);

            }
        }

        return base.SendAsync(request, cancellationToken);
    }

    private bool IsSwagger(HttpRequestMessage request)
    {
         return request.RequestUri.PathAndQuery.StartsWith("/swagger");
    }
}

добавьте обработчик в свой SwaggeConfig.cs (App_start>SwaggeConfig.cs) непосредственно перед включением Swagger:

public class SwaggerConfig
{
    public static void Register()
    {
        // Add here, before EnableSwagger
        GlobalConfiguration.Configuration.MessageHandlers.Add(new SwaggerAccessMessageHandler());

        GlobalConfiguration.Configuration
            .EnableSwagger(/*c => ....*/)
            .EnableSwaggerUi(/*c => ....*/);

    }
}

с наилучшими пожеланиями.

person D.L.MAN    schedule 06.04.2020

Создал новую папку под названием «swagger» в корне проекта. Имя папки должно соответствовать URL-адресу документации swagger.

Добавлен новый файл Web.config во вновь созданную папку.

<configuration> 
<system.web> 
<authorization> 
<deny users="?" /> 
</authorization> 
</system.web> 
<system.webServer> 
<modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 
</configuration>

ответ найден здесь.

Другой вариант будет:

«Навскидку я бы сказал, что DelegatingHandler — это то, что вам здесь нужно».

ответ найден здесь.

person pirin    schedule 13.11.2015